c++ 当可执行文件一开始就抛出异常时,CreateProcess无法抛出错误

nwlls2ji  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(138)

有一个可执行文件,我在program.cs中的解决方案的开头抛出了一个异常。当使用CreateProcessA()从不同的解决方案加载此可执行文件时,我看到进程加载并且没有给予我错误消息。如何捕获此异常?

STARTUPINFOA startupInfo;
PROCESS_INFORMATION pi;
ZeroMemory(&startupInfo, sizeof(startupInfo));
startupInfo.cb = sizeof(startupInfo);
ZeroMemory(&pi, sizeof(pi));

const auto dwCreationFlags = showConsole ? CREATE_NEW_CONSOLE : CREATE_NO_WINDOW;
auto canCreate = true;
if (!CreateProcessA(
    nullptr,                                // LPCWSTR IpApplicationName
    const_cast<LPSTR>(command.c_str()),     // LPSTR IpCommandLine
    nullptr,                                // LPSECURITY_ATTRIBUTES IpProcessAttributes
    nullptr,                                // LPSECURITY_ATTRIBUTES IpThreadAttributes
    false,                                  // BOOL bInheritHandles,
    dwCreationFlags,                        // DWORD dwCreationFlags
    nullptr,                                // LPVOID IpEnvironment
    nullptr,                                // LPCWSTR IpCurrentDirectory
    &startupInfo,                           // LPSTARTUPINFOW IpStartupInfo
    &pi                                     // LPPROCESS_INFORMATION IpProcessInformation
))
{
    canCreate = false;
    return Status(WinUtil::GetLastErrorMessage());
}
//canCreate = false;

// Wait until child process exits.
WaitForSingleObject(pi.hProcess, 0);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return Status();

我希望它返回false并捕获异常。
然而,它现在会循环一段时间,然后抛出一个通用消息,说它启动失败。它没有捕获我在解决方案开始时抛出的异常。

yhxst69z

yhxst69z1#

你不能跨语言边界抛出异常,更不用说跨进程边界了。一个C应用程序不能捕获在一个单独的C#应用程序中抛出的异常。
当C#应用程序抛出一个没有被捕获的异常时,它将简单地终止自己。启动它的C
应用程序无法捕获该未捕获的异常。它唯一能做的就是等待C#应用程序终止(您已经在这样做了),然后使用GetExitCodeProcess()获取退出代码,它在意外失败时将为非零(例如,对于未捕获的托管异常为0xE0434352,对于访问冲突为0xC0000005,对于堆栈溢出为0xC00000FD,等等)。
参见:Exit Code When Unhandled Exception Terminates Execution?

相关问题