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