首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当将ShellExecute返回(HINSTANCE)转换为int时避免MSVC警告

当将ShellExecute返回(HINSTANCE)转换为int时避免MSVC警告
EN

Stack Overflow用户
提问于 2021-04-14 19:46:44
回答 1查看 278关注 0票数 0

docs for ShellExecute状态(斜体强调地雷):

返回值

类型:HINSTANCE

如果函数成功,则返回大于32的值。如果函数失败,它将返回一个错误值,该值指示故障的原因。为了与16位Windows应用程序向后兼容,返回值转换为HINSTANCE .然而,这并不是真正的HINSTANCE。只能将其转换为int,并将其与下面的32或以下错误代码进行比较。

然而,像这样服从他们:

代码语言:javascript
运行
复制
if ((int)ShellExecuteW(...) <= 32) ...

使用MSVC 2019编译时会产生警告(32位和64位):

代码语言:javascript
运行
复制
warning C4311: 'type cast': pointer truncation from 'HINSTANCE' to 'int'
warning C4302: 'type cast': truncation from 'HINSTANCE' to 'int'

使用reinterpret_cast<int>会产生类似的结果。

我可以压制这一行的警告:

代码语言:javascript
运行
复制
#pragma warning(suppress: 4311 4302)
if ((int)ShellExecuteW(...) <= 32) ...

但我一般不喜欢这样做,除非没有其他选择。因此,我的问题是:是否还有其他选择?有什么C++语法可以让我在不生成警告的情况下遵守API文档?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-14 20:08:05

HINSTANCE是指针类型。编译器警告您,指针的大小大于int的大小,因此在将HINSTANCE转换为int时将截断位。在为64位编译时会发生这种情况,其中指针为8字节,int为4字节。

在这种特殊情况下,截断是很好的,因为值永远不会超过int所能容纳的值。但是,如果您真的想避免这些警告,那么只需使用intptr_tINT_PTR或任何类似的指针大小的整数类型,例如:

代码语言:javascript
运行
复制
if (reinterpret_cast<intptr_t>(ShellExecuteW(...)) <= 32) {
    ...
}

否则,根本不使用ShellExecute(),而是使用ShellExecuteEx()。它返回一个成功/失败的BOOL,并使用GetLastError()报告失败时的标准Win32错误代码( ShellExecute()返回的大多数错误代码都不是标准的Win32错误代码),例如:

代码语言:javascript
运行
复制
SHELLEXECUTEINFOW info = {...};

if (!ShellExecuteExW(&info)) {
    DWORD error = GetLastError();
    ...
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67098202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档