2

我正在使用 Shell 命令来启动一个进程。我的开发环境是 C++/QT Creator/QT Libraries 和 Windows API。

如何处理 HINSTANCE 返回值?if (hInstance < 32) 代码抛出编译错误

    437: error: ISO C++ forbids comparison between pointer and integer


    HINSTANCE hInstance = ShellExecute(0, QString("open").toStdWString().c_str(), Path.toStdWString().c_str(), 0, 0, SW_SHOWNORMAL);
   if (hInstance < 32)
      qDebug() << "Error";
4

2 回答 2

1

如果有人仍在为此苦苦挣扎,这是一个避免警告的解决方案:

int retValue = static_cast<int>(reinterpret_cast<uintptr_t>(ShellExecute(<etc>)));

请参阅uintptr_t 何时优于 intptr_t?有关 uintptr_t 的更多评论

于 2018-04-06T13:42:05.737 回答
0

您可以使用 reinterpret_cast 转换返回值:

int retValue  = reinterpret_cast<int>(ShellExecute(0, QString("open").toStdWString().c_str(), Path.toStdWString().c_str(), 0, 0, SW_SHOWNORMAL));
   if (retValue  < 32)
      qDebug() << "Error";

虽然它也可能导致警告:

警告 C4302:“reinterpret_cast”:从“HINSTANCE”截断到“int”

但至少它有效。在 MSDN 中,它还建议强制转换为 int。

https://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx

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

于 2018-02-23T02:17:01.173 回答