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

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

有一个可执行文件,我在

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 并捕获异常。

然而,它目前循环了一段时间,然后抛出了一条通用消息,说它启动失败。它没有捕捉到我在解决方案一开始抛出的异常。

c# c++ multithreading createprocess
1个回答
1
投票

你不能跨语言边界抛出异常,更不用说进程边界了。 C++ 应用程序无法捕获在单独的 C# 应用程序中抛出的异常。

当 C# 应用程序抛出未捕获的异常时,它会自行终止。启动它的 C++ 应用程序无法捕获未捕获的异常。它唯一能做的就是等待 C# 应用程序终止(你已经在做),然后使用

GetExitCodeProcess()
获取退出代码,在意外失败时它将是非零的(例如
 0xE0434352
表示未捕获的托管异常,
0xC0000005
表示访问冲突,
0xC00000FD
表示堆栈溢出,等等)。

请参阅:未处理的异常终止执行时退出代码?

© www.soinside.com 2019 - 2024. All rights reserved.