我有一个第三方 dll,我将它加载到不属于我的软件中,并且我正在使用 AllocConsole() 创建标准 Windows CLI 窗口,因此我可以轻松地输出调试消息。
我的问题是,它忽略了任何类型的输入。我只想能够使用我分配的控制台,并让我能够给它一些输入。
我有一个第三方 dll,我将它加载到不属于我的软件中,并且我正在使用 AllocConsole() 创建标准 Windows CLI 窗口,因此我可以轻松地输出调试消息。
我的问题是,它忽略了任何类型的输入。我只想能够使用我分配的控制台,并让我能够给它一些输入。
感谢 Ben Voigt,我能够在分配控制台后通过以下操作使控制台接收输入:
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
这也将 stdout 和 strerr 定向到同一个控制台窗口,以防它们因某种原因被定向到其他地方。
您是否还将stdout
and重定向stderr
到您的控制台?
我使用此代码从 Windows 应用程序访问 JavaVM 输出。
if(::AllocConsole())
{
int hCrt = ::_open_osfhandle((intptr_t) ::GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
FILE *hf = ::_fdopen( hCrt, "w" );
*stdout = *hf;
::setvbuf(stdout, NULL, _IONBF, 0 );
hCrt = ::_open_osfhandle((intptr_t) ::GetStdHandle(STD_ERROR_HANDLE), _O_TEXT);
hf = ::_fdopen( hCrt, "w" );
*stderr = *hf;
::setvbuf(stderr, NULL, _IONBF, 0 );
}
stdout
在此之后,我可以看到stderr
来自 VM 的所有输出。
这是对我有用的代码:
freopen("CONOUT$", "w", stdout);
CONIN$
你可能可以用and做类似的事情stdin
(当然是开放阅读)。
这就是我使用的。
FILE *file = nullptr;
freopen_s(&file,"CONIN$", "r", stdin);
freopen_s(&file, "CONOUT$", "w", stdout);
只是希望这可以帮助某人。