今天在給公司網(wǎng)絡(luò)游戲項(xiàng)目的patchupdate程序添加殺木馬的功能時(shí),遇到了問(wèn)題。
問(wèn)題如下: 我給patchupdate添加殺木馬功能是調(diào)用了一個(gè)dll內(nèi)的函數(shù),我是靜態(tài)鏈接的(就是include這個(gè)函數(shù)的頭文件,鏈接了個(gè).lib。patchupdate程序是先更新本身的,它把自己更新完了就重新啟動(dòng),這時(shí)因?yàn)槠湟蕾嚹莻€(gè)dll,所以報(bào)錯(cuò)“找不到某個(gè)dll”,那肯定沒(méi)法更新下來(lái)那個(gè)dll文件了。
經(jīng)高手指點(diǎn),用
動(dòng)態(tài)鏈接dll的方法成功解決了此問(wèn)題!故寫(xiě)此文以記之!
下面把幾個(gè)API的使用例子代碼貼出來(lái),方便以后查看,這個(gè)代碼可以在msdn里找到的。
#include <windows.h>
typedef int (*MYPROC)(LPTSTR);
int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
// Get a handle to the DLL module.
hinstLib = ::LoadLibrary(TEXT("myputs.dll"));
// If the handle is valid, try to get the function address.
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) ::GetProcAddress(hinstLib, "PatchUpdate"); /// 函數(shù) PatchUpdate();
// If the function address is valid, call the function.
if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
(ProcAdd) (TEXT("Message via DLL function\n"));
}
// Free the DLL module.
fFreeResult = ::FreeLibrary(hinstLib);
}
// If unable to call the DLL function, use an alternative.
if (! fRunTimeLinkSuccess)
printf("Message via alternative method\n");
return 0;
}
2007-10-23
現(xiàn)在又改成靜態(tài)鏈接的了,因?yàn)閯?dòng)態(tài)鏈接的話,只要把殺木馬的dll干掉就沒(méi)作用了。這樣子沒(méi)了這個(gè)dll就得重新安裝客戶端或者從別的地方拖這個(gè)dll過(guò)來(lái),patchupdate才能啟動(dòng)起來(lái)。
要把patchupdate用QT寫(xiě)的話,如果要玩家不用重新下載客戶端的話,就得:
1.把Qt編譯成靜態(tài)庫(kù),patchupdate鏈接用到的靜態(tài)庫(kù)。
or
2.改變更新次序,讓patchupdate先更新下Qt的dll下來(lái)(指定這個(gè)更新順序不能寫(xiě)在patchupdate自身里面,得靠srvflist.xml),這樣子的好處是patchupdate本身不會(huì)很大,其他用到Qt的東西也可以與其共享Qt的dll,比如獨(dú)立于客戶端的聊天軟件
ps:剛才看了下,更新順序是寫(xiě)在patchupdate里面的。所以否定2方法。
posted on 2007-04-29 02:08
七星重劍 閱讀(1500)
評(píng)論(8) 編輯 收藏 引用 所屬分類:
PL--c/c++