由于想在游戲中(非mfc程序)調(diào)用一個dll用來監(jiān)控游戲中一些數(shù)據(jù)變化,而這些數(shù)據(jù)可以觸發(fā)式變動,所以想到用mfc來弄,
但網(wǎng)上查的
“非mfc程序調(diào)用mfc擴展dll”似乎有點麻煩,也沒有什么成樣的例子。
后來還是自己對比正常的mfc程序加載方式修改出來了,步驟如下:
1.
exe工程要設置成Use Standard Windows Libraries或者Use MFC in a Shared DLL(因為我們不用mfc,所以設置成前者)
2.
dll工程用vc向?qū)?chuàng)建mfc擴展dll
3. 在dll工程中拷貝相關的app,mainfrm和view以及doc框架(可以用vc向?qū)?chuàng)建一個正常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. 如果是隱式調(diào)用的話,在exe中加入:
#define AFX_EXT_API __declspec(dllexport)
#include "..\mfcdll\mfcdll.h" // 這個是dll要導出的東西
這樣就可以了
5.顯式調(diào)用的話,用LoadLibrary先裝載,再獲取對應導出函數(shù)調(diào)用就應該也可以了(這個沒試)
6.上述處理后只能顯示,但按鍵接收還不行,因為消息循環(huán)沒有地方調(diào)用。。。它原來是系統(tǒng)調(diào)用app->run(),在其中循環(huán)處理的。
如果直接在dll中調(diào)用app的run()的話,mainfrm的PreTranslateMessage就能收到按鍵消息了。但這樣由于是主線程中調(diào)用app->run(),而run()中
是消息死循環(huán),所會exe會沒機會響應。。。所以解決辦法是模擬app->run()寫一個runoneframe()函數(shù),然后每次刷新一下(或者創(chuàng)建新線程來刷新, 臨時試了一下會crash,我沒用這種辦法,先不查了,不過理論上應該可以的)
這樣就ok了(view中按鍵自己再處理吧,這里不提了)
posted on 2012-09-14 15:56
flipcode 閱讀(1349)
評論(0) 編輯 收藏 引用