有一个可执行文件,我在
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# 应用程序中抛出的异常。
当 C# 应用程序抛出未捕获的异常时,它会自行终止。启动它的 C++ 应用程序无法捕获未捕获的异常。它唯一能做的就是等待 C# 应用程序终止(你已经在做),然后使用
GetExitCodeProcess()
获取退出代码,在意外失败时它将是非零的(例如 0xE0434352
表示未捕获的托管异常,0xC0000005
表示访问冲突,0xC00000FD
表示堆栈溢出,等等)。
请参阅:未处理的异常终止执行时退出代码?