gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:09:54 27 4
gpt4 key购买 nike

作为开始我的问题之前的快速说明,我对 C++ 尤其是 DLL 还很陌生。

我目前正在 VS2012 中编写一个 C++ DLL,用于一个程序。请注意,我没有特定程序的源代码访问权限。当有问题的程序要求它做某事时,我想将一些输出从 DLL 写入一个单独的控制台窗口。

我的问题是,我将如何着手做这样的事情?为了准确说明我想要什么,我希望在 DLL 附加到程序后立即打开一个单独的控制台窗口,然后让它将输出写入控制台。当 DLL 与程序分离时,它还应该关闭控制台窗口。

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

感谢任何输入。

最佳答案

接下来的类(class)会让您了解您需要做什么。在构建过程中,CConsole 尝试使用 AllocConsole 为进程创建一个新的控制台。

如果 AllocConsole 失败,则什么都没有改变——控制台已经存在并且该类假定 C-Runtime 句柄已经在其他地方设置。

如果 AllocConsole 成功,当前与 stdout 和 stdin 关联的对象将被保存,然后这些对象将被为新控制台创建的对象替换。现在 C-Runtime 输出函数(如 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com