函数返回值转换

问题描述 投票:0回答:1

我目前正在使用

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
,如文档中所述?

我可以得到一些关于这方面的信息吗?

c winapi
1个回答
0
投票

如果我理解正确的话,

ShellExecuteA
函数的返回值将被转换为
INT_PTR
,如文档中所述?

不,您误解了文档。这……

返回值被转换为 HINSTANCE 以实现向后兼容性 与 16 位 Windows 应用程序。 然而,这并不是真正的实例。 它只能转换为 INT_PTR 并与 32 或 以下错误代码如下。

...措辞不佳,但原始来源中的上下文在一定程度上缓解了这一点,这导致了:

如果函数成功,则返回一个大于 32 的值。如果函数失败,则返回一个错误值,指示失败的原因。

总的来说,这传达了文档试图更清楚地表达的内容:


返回类型为

HINSTANCE
,以向后兼容 16 位 Windows 应用程序,但它实际上是转换为该类型的整数代码。它的唯一有效用途是将其转换为
INT_PTR
类型,以便与数字 32 和/或下面的错误代码进行比较。该值大于 32 表示成功。


特别是,您的有责任执行到INT_PTR

的转换,就像您在第二个示例中通过强制转换所做的那样。

作为一个小补充点,这...

如果我像对变量一样使用类型转换

...暗示了对选角的误解。诸如

(INT_PTR)

 之类的强制转换运算符是一元 
运算符,在这个意义上类似于 !
 或一元 
-
。强制转换操作将操作数
value转换为运算符指定的数据类型。强制转换操作绝不是专门用于变量的。它们的操作数可以是任何类型的表达式,但要遵守 C 对定义类型转换的一般限制。

© www.soinside.com 2019 - 2024. All rights reserved.