我已经实现了一个 DLL(C++、VisualStudio、Windows),它扩展了另一个程序的功能(进一步 -
main program
)。main program
的内部架构,除了它是 GUI 程序并且本身不使用控制台窗口。main program
的交互是通过 DLL 中的一些导出函数发生的。交互效果很好,但在某些情况下 main programs
会崩溃。在某些情况下,当我只是按“x”关闭控制台窗口时,就会发生这种情况。创建和关闭控制台窗口的代码:
bool CreateConsole() {
HWND ConsoleWindowHandle = GetConsoleWindow();
if (ConsoleWindowHandle != NULL)
// console ia already created
return true;
BOOL res = AllocConsole();
if (res == 0) {
DWORD LastError = GetLastError();
return false;
}
freopen_s(&ConsoleStream, "CONOUT$", "w", stdout);
setlocale(LC_ALL, "...");
return true;
}
void CloseConsole() {
BOOL ok = FreeConsole();
ConsoleWindowHandle = 0;
}
你不需要
GetConsoleWindow()
,你可以无条件调用AllocConsole()
,如果已经存在控制台,它将失败。 另外,如果 FreeConsole()
失败,请勿调用 AllocConsole()
。
DebugOutputString()
。 如果您在调试器内运行应用程序,消息将显示在调试器的输出日志中。 如果您在调试器外部运行应用程序,您可以在应用程序中看到消息,例如 SysInternals DebugView。 不管怎样,根本不需要控制台窗口。 如果您需要 std::ostream
访问输出,您可以轻松编写(或找到)一个实现 std::basic_streambuf
的类来缓存输出并将其发送到 DebugOutputString()
,然后您可以将该类附加到 std:: ostream` 对象。