![](/img/trans.png)
[英]How Can I call a C++ Win32 DLL from another C++ win32 Console Application
[英]Can I use the default console in a Win32 GUI application, or should I create a new one?
我是Windows API的新手,我正在用C ++编程。 我想有一个控制台,通过GetMessage输出信息并接收键盘命令。 但是,我不能只创建一个控制台应用程序,因为如果我这样做,就无法读取使用GetMessage
发送到该控制台的键盘消息。 通过GetMessage对键盘输入做出反应是该项目的必要条件。
当我在Code :: Blocks 13.12中创建Win32 GUI应用程序(使用MinGW编译)并在开头调用AllocConsole
时,我收到错误5:“访问被拒绝”。 如果我首先使用FreeConsole
, FreeConsole
成功而不会出错; 如果我然后使用AllocConsole
,则会出现一个控制台窗口。 FreeConsole
的MSDN描述是:
从其控制台中分离调用进程。
这表明在我调用FreeConsole之前,已经存在一个控制台(即使我看不到它并且没有明确创建它)。 它是一个不可见的控制台,还是在运行Code :: Blocks项目时总是出现的控制台? 使用FreeConsole
然后使用AllocConsole
对我来说毫无意义吗? 是否有一种方法可以使已经存在的控制台可见(如果它不可见)并且能够通过GetMessage
接收键盘输入?
以下是展示此行为的精简代码示例:
#include <windows.h>
DWORD dw = 0;
int WINAPI WinMain (HINSTANCE hThisInstance,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nCmdShow)
{
if (FreeConsole() == 0) {
dw = GetLastError();
return dw;
}
if (AllocConsole() == 0) {
dw = GetLastError();
return dw;
}
return 1;
}
当我在Code :: Blocks中创建Win32 GUI应用程序(使用MinGW进行编译)并在开头调用
AllocConsole
时,我收到错误5: 访问被拒绝 。
您对AllocConsole
的调用失败的原因是您实际上正在构建一个控制台应用程序。 即使您使用WinMain
,默认情况下,mingw仍会生成一个针对控制台子系统的可执行文件。 您可以使用像dumpbin
这样的工具来检查PE头以确认我的结论。
使用-mwindows
进行编译以确保可执行文件以GUI子系统为目标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.