![](/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.