我正在使用 Shell 命令来启动进程。我的开发环境是 C++/QT Creator/QT Libraries 和 Windows API。
如何处理 HINSTANCE 返回值? if (hInstance < 32) code throwing a compilation error
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";
如果有人仍然为此苦苦挣扎,这里有一个避免警告的解决方案:
int retValue = static_cast<int>(reinterpret_cast<uintptr_t>(ShellExecute(<etc>)));
有关 uintptr_t 的更多评论,请参阅何时 uintptr_t 优于 intptr_t?
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 应用程序。然而,这并不是真正的实例。它只能转换为 int 并与 32 或下面的错误代码进行比较。'
HINSTANCE _hi_stuff = ShellExecuteW(NULL, L"open", _stuff_to_open.c_str(), NULL NULL, SW_SHOWNORMAL);
DWORD error = GetLastError();
if ( error == ERROR_FILE_NOT_FOUND)
if(MessageBoxW(NULL, L"file not found!\ndo you want to locate it?" , L"oh fuck!" , MB_YESNO) == IDYES)
{
//do something
}