我已经实现了一个 DLL(C++、VisualStudio、Windows),它扩展了另一个程序的功能(以下称为main program
)。
我不知道 的内部架构main program
,只知道它是 GUI 程序,本身不使用控制台窗口。DLL
创建控制台窗口并使用它来生成用于调试目的的输出(std::cout/wcout)。DLL
的交互main program
通过 DLL 中的一些导出函数进行。交互工作正常,但在某些情况下会main programs
崩溃。在某些情况下,当我简单地按“x”关闭控制台窗口时,就会发生这种情况。
问题是:您是否看到 DLL 使用控制台窗口的任何潜在风险,当 DLL 函数完成工作时,我是否应该关闭控制台窗口?您是否看到在这种方案中使用控制台明显违反纪律?
创建和关闭控制台窗口的代码:
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()
失败,请不要调用。无论如何,有一个更好的选择,一个实际上是为调试输出而设计的选择 - 。如果您在调试器内运行应用程序,则消息将显示在调试器的输出日志中。如果您在调试器之外运行应用程序,则可以使用SysInternals DebugView
DebugOutputString()
查看消息。无论哪种方式,都根本不需要控制台窗口。如果您需要
std::ostream
访问您的调试输出,您可以轻松编写一个类(或找到第三方类)std::basic_streambuf
来实现缓存输出并将其发送到DebugOutputString()
,然后您可以将该类附加到一个std::ostream
对象。