c++ - 从 C++ DLL 打开并写入控制台

标签 c++ visual-c++ dll console

在开始我的问题之前,请先快速说明一下,我对 C++ 尤其是 DLL 还很陌生。

我目前正在 VS2012 中编写 C++ DLL,以便与程序一起使用。请注意,我无权访问特定程序的源代码。 当相关程序要求执行某些操作时,我想将一些输出从 DLL 写入到单独的控制台窗口。

我的问题是,我将如何去做这样的事情?为了明确我想要什么,我希望在 DLL 连接到程序后立即打开一个单独的控制台窗口,然后将其输出到控制台。当 DLL 与程序分离时,它也应该关闭控制台窗口。

到目前为止,我的猜测是在我的解决方案中创建一个单独的 Win32 控制台应用程序项目,然后可能在我的 DLL 中引用它,并让它执行其中的某些方法,输出包含在调用的参数中。但我不知道如何解决这个问题,特别是因为我希望将这个单独的控制台项目包含在同一个 DLL 中。

感谢您的任何意见。

最佳答案

下面的类(class)将让您了解您需要做什么。 在构造时,CConsole 尝试使用 AllocConsole 为该进程创建一个新控制台。

如果 AllocConsole 失败,则不会发生任何更改 - 控制台已经存在,并且该类假定 C 运行时句柄已在其他位置设置。

如果 AllocConsole 成功,当前与 stdout 和 stdin 关联的对象将被保存,然后这些对象将替换为为新控制台创建的对象。现在,C 运行时输出函数(如 printf)将输出到新控制台。 cout 和 cin 也将使用新控制台。

RemoveMenu 调用将阻止用户关闭控制台窗口,从而终止进程。超出这个功能就没有必要了。

当 CConsole 被销毁(并且 AllocConsole 成功)时,stdout 和 stdin 将恢复,然后通过调用 FreeConsole 关闭控制台。

当您希望控制台在创建它的函数之外持续存在时,我发现此类很不方便 - 您需要获取一个新的 CConsole 并跟踪其指针,直到您通过删除将其关闭。但它的实现列出了您在自己的项目中需要采取的步骤。我从未用 dll 尝试过此操作,但我看不出有任何理由会造成问题。

控制台.h:

#pragma once
#include <stdio.h>

class CConsole {
    FILE m_OldStdin, m_OldStdout;
    bool m_OwnConsole;
public:
    CConsole();
    ~CConsole();
};

控制台.cpp:

#include <windows.h>
#include <conio.h>
#include <FCNTL.H>
#include <io.h>
#include "Console.h"

static BOOL WINAPI MyConsoleCtrlHandler(DWORD dwCtrlEvent) { return dwCtrlEvent == CTRL_C_EVENT;}

CConsole::CConsole() : m_OwnConsole(false) {
    if(!AllocConsole()) return;

    SetConsoleCtrlHandler(MyConsoleCtrlHandler, TRUE);
    RemoveMenu(GetSystemMenu(GetConsoleWindow(), FALSE), SC_CLOSE, MF_BYCOMMAND);
    const int in  = _open_osfhandle(INT_PTR(GetStdHandle(STD_INPUT_HANDLE)),  _O_TEXT);
    const int out = _open_osfhandle(INT_PTR(GetStdHandle(STD_OUTPUT_HANDLE)), _O_TEXT);
    m_OldStdin  = *stdin;
    m_OldStdout = *stdout;

    *stdin  = *_fdopen(in,  "r");
    *stdout = *_fdopen(out, "w");

    m_OwnConsole = true;
}

CConsole::~CConsole() {
    if(m_OwnConsole) {
        fclose(stdout);
        fclose(stdin);
        *stdout = m_OldStdout;
        *stdin  = m_OldStdin;
        SetConsoleCtrlHandler(MyConsoleCtrlHandler, FALSE);
        FreeConsole();
    }
}

享受吧!

关于c++ - 从 C++ DLL 打开并写入控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16500726/

相关文章:

c++ - 在 MSVC 中获取负 `time_t` 的 DST

C# 模块应该包含程序集 list

c++ - 可以在 FileCommonDialog 上添加文本框吗?

c++ - 在 1 秒内打印前 100 万个质数,约束程序大小为 50000 字节且内存有限

c++ - std::numeric_limits<double>::min() 上的错误 C2589

c++ - MSVC汇编函数自变量C++与_asm

.net - 在没有管理员权限的情况下注册.Net COM DLL

从 Fortran 调用 C dll

c++ - 获取在寄存器中传递的参数的地址

c++ - 在 cuda-gdb 中数组值更改时设置断点