从 DLL 创建控制台窗口以进行调试

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

我已经实现了一个 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;
}
c++ dll console
1个回答
0
投票

你不需要

GetConsoleWindow()
,你可以无条件调用
AllocConsole()
,如果已经存在控制台,它将失败。 另外,如果
FreeConsole()
失败,请勿调用
AllocConsole()

无论如何,有一个更好的选择,实际上是为调试输出而设计的 -

DebugOutputString()
。 如果您在调试器内运行应用程序,消息将显示在调试器的输出日志中。 如果您在调试器外部运行应用程序,您可以在应用程序中看到消息,例如 SysInternals DebugView。 不管怎样,根本不需要控制台窗口。 如果您需要
std::ostream
访问输出,您可以轻松编写(或找到)一个实现
std::basic_streambuf
的类来缓存输出并将其发送到
DebugOutputString()
,然后您可以将该类附加到 std:: ostream` 对象。

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