在 Win32 Application 和 Win32 Console Application 中使用 MFC (轉)
在 Application 和 Win32 Console Application 中使用 MFC
在Virtual C++ 6.0建立的Win32 Application 和 Win32 Console Application 中使用 MFC 是可能的,主要的困難在於繞過MFC提供的WinMain。下面我提供一個方法以供參考:
:namespace prefix = o ns = "urn:schemas--com::office" />
進入 Project-->Setting--> C/C++ Page,做以下修改:
1. 在Preprocessor definitions中加入_AFXDLL,加入後的設定大概是這樣的:
WIN32,_DE / NODEBUG,[_CONSOLE],[_MBCS],_AFXDLL
加入的_AFXDLL是關鍵 ,它欺騙MFC LIB,避免連線 MFC 的 WinMain 函式。
2. 修改Project Options,將 /MT或者 /ML標誌改為 /MD。
原因是在 afxver_.h 中會檢查_AFXDL, _MT, _DLL 標誌是否同時設定,否則報錯。儘管連結 For Multi-Threaded 版本的 Library 會損失一些,但是這個標誌的存在並不導致把 Project 編譯成 DLL。
3. 在Project的 stdafx.h 中包含必要的頭,或者直接從MFC AppWizard建立的stdafx.h中複製:
#define VC_EXTRALEAN // Exclude rarely-used stuff from headers
#include
#include
#include
#include
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include
#endif // _AFX_NO_AFXCMN_SUPPORT
4. 在Project的WinMain / main中加入MFC的初始化程式碼,以下是_tWinMain和_tmain的情況:
extern "C" int WIN
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
int nRetCode = 0;
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
TRACE0("al Error: MFC initialization failed.n");
nRetCode = 1;
}
else
{
// Actual WinMain codes ...
AfxWinTerm();
}
return nRetCode;
}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
cerr << _T("Fatal Error: MFC initialization failed") << endl;
nRetCode = 1;
}
else
{
// Actual main codes ...
AfxWinTerm();
}
return nRetCode;
}
此外,在Virtual C++ 6.0建立的Win32 Dynamic-Link Library中也可以單獨使用MFC,這樣可以避免Project被MFC AppWizard和ATL AppWizard新增CWinApp例項,方法簡單,如下構造Project的DllMain函式即可:
#include
static AFX_EXTENSION_MODULE ProjectDLL = { NULL, NULL };
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, D dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved.
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
// Extension DLL one-time initialization.
if (!AfxInitExtensionModule(ProjectDLL, hInstance))
{
TRACE0("Project.DLL initialize its extension module failed!n");
return FALSE;
}
// CDynLinkLibrary’s destructor will be called in AfxTermExtensionModule.
new CDynLinkLibrary(ProjectDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("Project.DLL tenating...n");
// Terminate the library before destructors are called.
AfxTermExtensionModule(ProjectDLL);
}
return TRUE; // ok.
}
◆
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992749/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mfc和win32區別Win32
- 在Win32中管理虛擬記憶體 (轉)Win32記憶體
- No MFC 程式設計01 - 最精簡的 win32 程式 (轉)程式設計Win32
- Win32/MFC/COM學習推薦書籍Win32
- VS2008中 ATL CLR MFC Win32 區別Win32
- Win32彙編教程二 Win32彙編程式的結構和語法 (轉)Win32
- Win32::ODBC Object Document (轉)Win32Object
- Win32全域性鉤子在VC5中的實現 (轉)Win32
- Delphi Win32 API 使用的特殊情況 (轉)Win32API
- win32 PE 檔案格式 (轉)Win32
- Win32彙編的環境和基礎(轉)Win32
- Win32彙編的環境和基礎 (轉)Win32
- Win32學習筆記 序 (轉)Win32筆記
- Spring Boot 應用使用 application.yml 和 application.properties 的區別Spring BootAPP
- Elixir 分散式 Application 故障轉移和接管分散式APP
- 使用Shell.Application技術之二 (轉)APP
- Billy Belceb 病毒編寫教程for Win32 ----Win32優化Win32優化
- Billy Belceb 病毒編寫教程for Win32 ----Win32多型Win32多型
- 在Web Application Designer 中增加工具欄WebAPP
- 移位指令在Win32訊息處理中的一些問題(轉)Win32
- 在 Swift 中使用 Watch Connectivity — Application ContextSwiftAPPContext
- Catch Application Exceptions in a Windows Forms ApplicationAPPExceptionWindowsORM
- Win32 API 登錄檔類的編制以及使用 (轉)Win32API
- 基本概念(win32)彙編教程(轉)Win32
- Win32全域性鉤子實現 (轉)Win32
- Win32彙編教程十二 管道操作 (轉)Win32
- Win32 SDK登錄檔操作——RegQueryValueEx (轉)Win32
- Billy Belceb 病毒編寫教程for Win32 ----Win32 反除錯Win32除錯
- 【筆記】《深入淺出MFC》第5章 總觀Application Framework筆記APPFramework
- Application(EBS)開發整理(轉)APP
- Application_End Application_Start 呼叫APP
- WPF中嵌入普通Win32程式的方法Win32
- Billy Belceb 病毒編寫教程for Win32 ----高階Win32技術Win32
- 例說WIN32 Tab控制元件使用Win32控制元件
- WIN32 SDK - 捕獲滑鼠離開和滯留等事件 (轉)Win32事件
- Android中Application類用法AndroidAPP
- WIN32使用者介面設計基礎之Cursor篇 (轉)Win32
- Win32除錯API學習心得(一) (轉)Win32除錯API