【问题标题】:How do the WinAPI Shell APIs differ from the base API and CRT functions?WinAPI Shell API 与基本 API 和 CRT 函数有何不同?
【发布时间】:2013-10-01 11:54:41
【问题描述】:
我正在阅读 Windows 进程 API,并提出三个问题:
基础 API 和 shell API 有什么区别?我读到外壳 API 包装了基本 API,例如ShellExecute() 和 ShellExecuteEx() 包装了 CreateProcess() 但无法理解区别。
基本 API 和 Shell API 与 CRT 函数(C 运行时)有何不同。同样,exec() 和 spawn() CRT 函数包装了基本 API 的 CreateProcess()。
我知道我可以通过编译和链接正确的头文件直接从代码中使用基本 API 和 CRT 函数。如何使用 Shell API?
【问题讨论】:
标签:
windows
api
winapi
process
【解决方案1】:
1) 基础 API 和 shell API 有什么区别?
他们做不同的事情。 ShellExecute 系列以与 shell 相同的方式执行操作,即与 Windows 资源管理器相同。它不仅仅是一个围绕 CreateProcess 的包装器。例如,如果您将 word 文档的路径传递给 ShellExecute,ShellExecute 将在注册表中查找打开 word 文档的正确方法,然后执行此操作。
ShellExecute 还可以执行您在 Windows 上下文菜单中看到的其他“动词”,例如编辑、打印等。
2) 基本 API 和 Shell API 与 CRT 函数有何不同
CRT 函数在 Windows 上实现,以便与 C 标准兼容。它们是 CreateProcess 的包装器,但它们存在的原因是为了兼容而不是提供额外的功能。
3) 如何使用 Shell API 的
要使用 shell API,您只需包含头文件并链接正确的库,就像使用任何其他 API 一样。
例如,ShellExecute:
正如您在页面底部看到的,它会告诉您要包含哪个文件以及要链接到哪个库。
要求
支持的最低客户端:Windows XP [仅限桌面应用]
支持的最低服务器:Windows 2000 Server [仅限桌面应用]
头文件:Shellapi.h
库:Shell32.lib
DLL:Shell32.dll(3.51 或更高版本)
Unicode 和 ANSI 名称:ShellExecuteW (Unicode) 和 ShellExecuteA
(ANSI)
【解决方案2】:
shell(又名 Windows 资源管理器)增加了一层额外的功能。它管理文件关联,当您要求它“运行”一个文档时,它知道应该启动什么 EXE。如果您传递一个 .html 文件的名称,那么 ShellExecuteEx() 可以确定需要启动浏览器。它还支持动词,您可以对文档执行不同的操作。除了“open”,默认动词,例如“print”和“edit”动词很常见。
CreateProcess() 中缺少这个,它只知道如何启动一个可执行文件。仍然有很多选项,请查看 MSDN 文档以了解安全属性和创建标志选项。
CRT 函数中缺少很多这些口哨,它们适用于任何操作系统,因此除了指定可执行文件名称和命令行参数之外,您无能为力。