由于想在游戲中(非mfc程序)調用一個dll用來監控游戲中一些數據變化,而這些數據可以觸發式變動,所以想到用mfc來弄,
但網上查的
“非mfc程序調用mfc擴展dll”似乎有點麻煩,也沒有什么成樣的例子。
后來還是自己對比正常的mfc程序加載方式修改出來了,步驟如下:
1.
exe工程要設置成Use Standard Windows Libraries或者Use MFC in a Shared DLL(因為我們不用mfc,所以設置成前者)
2.
dll工程用vc向導創建mfc擴展dll
3. 在dll工程中拷貝相關的app,mainfrm和view以及doc框架(可以用vc向導創建一個正常mfc框架程序用來拷貝)
然后在dllmain的attach中加入如下語句即可:
//----------------------------------------
// AFX internal initialization
if (!AfxWinInit(hInstance, 0, "", 1))
return 0;
// Register the doc templates we provide to the app
CWinApp* pApp = AfxGetApp();
ENSURE(pApp != NULL);
pApp->InitApplication();
pApp->InitInstance();
//----------------------------------------
4. 如果是隱式調用的話,在exe中加入:
#define AFX_EXT_API __declspec(dllexport)
#include "..\mfcdll\mfcdll.h" // 這個是dll要導出的東西
這樣就可以了
5.顯式調用的話,用LoadLibrary先裝載,再獲取對應導出函數調用就應該也可以了(這個沒試)
6.上述處理后只能顯示,但按鍵接收還不行,因為消息循環沒有地方調用。。。它原來是系統調用app->run(),在其中循環處理的。
如果直接在dll中調用app的run()的話,mainfrm的PreTranslateMessage就能收到按鍵消息了。但這樣由于是主線程中調用app->run(),而run()中
是消息死循環,所會exe會沒機會響應。。。所以解決辦法是模擬app->run()寫一個runoneframe()函數,然后每次刷新一下(或者創建新線程來刷新, 臨時試了一下會crash,我沒用這種辦法,先不查了,不過理論上應該可以的)
這樣就ok了(view中按鍵自己再處理吧,這里不提了)
posted on 2012-09-14 15:56
flipcode 閱讀(1334)
評論(0) 編輯 收藏 引用