ShellExecuteA
函数,在查看 返回值 时,我对如何处理它有点困惑。具体来说,它说的部分:
返回值被转换为 HINSTANCE,以向后兼容 16 位 Windows 应用程序。然而,这并不是真正的实例。它只能转换为 INT_PTR 并与 32 或以下错误代码进行比较。
因此,当我编写以下代码块来处理错误情况时,在使用 Visual Studio 2022 进行编译时会收到一条警告消息:
// Open Documents folder so shortcut looks legitimate
if (ShellExecuteA(NULL, "explore", dirPath, NULL, NULL, SW_SHOWNORMAL) < 32) {
return 1;
}
warning C4047: '<': 'HINSTANCE' differs in levels of indirection from 'int'
如果我像对变量一样使用类型转换,问题似乎就消失了。
// Open Documents folder so shortcut looks legitimate
if ((INT_PTR)ShellExecuteA(NULL, "explore", dirPath, NULL, NULL, SW_SHOWNORMAL) < 32) {
return 1;
}
如果我理解正确的话,
ShellExecuteA
函数的返回值将被转换为INT_PTR
,如文档中所述?
我可以得到一些关于这方面的信息吗?
如果我理解正确的话,
函数的返回值将被转换为ShellExecuteA
,如文档中所述?INT_PTR
不,您误解了文档。这……
返回值被转换为 HINSTANCE 以实现向后兼容性 与 16 位 Windows 应用程序。 然而,这并不是真正的实例。 它只能转换为 INT_PTR 并与 32 或 以下错误代码如下。
...措辞不佳,但原始来源中的上下文在一定程度上缓解了这一点,这导致了:
如果函数成功,则返回一个大于 32 的值。如果函数失败,则返回一个错误值,指示失败的原因。
总的来说,这传达了文档试图更清楚地表达的内容:
返回类型为
HINSTANCE
,以向后兼容 16 位 Windows 应用程序,但它实际上是转换为该类型的整数代码。它的唯一有效用途是将其转换为 INT_PTR
类型,以便与数字 32 和/或下面的错误代码进行比较。该值大于 32 表示成功。
特别是,您的有责任执行到INT_PTR
如果我像对变量一样使用类型转换...暗示了对选角的误解。诸如
(INT_PTR)
之类的强制转换运算符是一元运算符,在这个意义上类似于
!
或一元
-
。强制转换操作将操作数value转换为运算符指定的数据类型。强制转换操作绝不是专门用于变量的。它们的操作数可以是任何类型的表达式,但要遵守 C 对定义类型转换的一般限制。