如何在QT Creator中检查ShellExecute命令返回(HINSTANCE)代码

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

我正在使用 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";
c++ qt winapi
3个回答
1
投票

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

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

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


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 应用程序。然而,这并不是真正的实例。它只能转换为 int 并与 32 或下面的错误代码进行比较。'


0
投票
使用 mingw64 编译得很好,即使使用 -o3 -s 开关也是如此。

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 }
    
© www.soinside.com 2019 - 2024. All rights reserved.