随笔 - 505  文章 - 1034  trackbacks - 0
<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345


子曾经曰过:编程无他,唯手熟尔!

常用链接

留言簿(94)

随笔分类(649)

随笔档案(505)

相册

BCB

Crytek

  • crymod
  • Crytek's Offical Modding Portal

Game Industry

OGRE

other

Programmers

Qt

WOW Stuff

搜索

  •  

积分与排名

  • 积分 - 800037
  • 排名 - 16

最新随笔

最新评论

阅读排行榜

评论排行榜

今天在给公司网络游戏项目的patchupdate程序添加杀木马的功能时,遇到了问题。
问题如下: 我给patchupdate添加杀木马功能是调用了一个dll内的函数,我是静态链接的(就是include这个函数的头文件,链接了个.lib。patchupdate程序是先更新本身的,它把自己更新完了就重新启动,这时因为其依赖那个dll,所以报错“找不到某个dll”,那肯定没法更新下来那个dll文件了。

经高手指点,用动态链接dll的方法成功解决了此问题!故写此文以记之!
下面把几个API的使用例子代码贴出来,方便以后查看,这个代码可以在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"); /// 函数 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
现在又改成静态链接的了,因为动态链接的话,只要把杀木马的dll干掉就没作用了。这样子没了这个dll就得重新安装客户端或者从别的地方拖这个dll过来,patchupdate才能启动起来。
要把patchupdate用QT写的话,如果要玩家不用重新下载客户端的话,就得:

1.把Qt编译成静态库,patchupdate链接用到的静态库。

or

2.改变更新次序,让patchupdate先更新下Qt的dll下来(指定这个更新顺序不能写在patchupdate自身里面,得靠srvflist.xml),这样子的好处是patchupdate本身不会很大,其他用到Qt的东西也可以与其共享Qt的dll,比如独立于客户端的聊天软件
    ps:刚才看了下,更新顺序是写在patchupdate里面的。所以否定2方法。
posted on 2007-04-29 02:08 七星重剑 阅读(1415) 评论(8)  编辑 收藏 引用 所属分类: PL--c/c++

FeedBack:
# re: 动态链接dll 2007-04-30 11:07 wangjs
基本的概念都有搞清楚,DLL只有隐式或显式链接。  回复  更多评论
  
# re: 动态链接dll 2007-05-02 00:39 xbx
楼上的,你才没搞清楚呢。本来就是静态和动态两种,你说的那两种,实际上就是一样的东西,不同的叫法。
BS你。  回复  更多评论
  
# re: 动态链接dll 2007-05-03 22:43 To Be C++
@xbx
这位老兄似乎也不怎么明白啊! 回去再翻翻书吧!  回复  更多评论
  
# re: 动态链接dll 2007-05-06 14:48 wangjs
@xbx
见不得别人说你家小孩吗?看把你急的。说你不对了就要吃了我试的。  回复  更多评论
  
# re: 动态链接dll 2007-09-17 08:01 蚂蚁终结者
也有叫load-time dynamic linking和run-time dynamic linking,上面的是run-time dynamic linking  回复  更多评论
  
# re: 动态链接dll[未登录] 2007-10-30 12:20 Daniel
争论挺有意思

我是Gooooooooooooooogle过来的,恰巧看到了

我是这么理解的

静态链接是说 Lib文件里面包含完整的代码,而不仅仅是说几个导出函数
动态链接有两种方式,显示和隐式 如果提供一个 Lib和一个.h头声明,实际链接之后仍然需要.dll文件就是隐式,LoadLibrary,Get地址,那是显示。如果是隐式调用 Windows Shell程序在加载PE文件的时候会进行关联性文件检查,如果缺少Dll文件会提示,如果实现显式Load,Get的话,PE文件可以自性检查加载是否成功。
  回复  更多评论
  
# re: 动态链接dll 2008-04-04 19:58 idlqy
呵呵,是巨人网游吧?能不能做个免更新的外挂什么的啊?每次都要srvflist.xml更新~~好麻烦的。  回复  更多评论
  
# re: 动态链接dll 2008-04-04 21:30 七星重剑
@idlqy
巨人更新很频繁,说明开发人员很勤奋啊,是吧?
当然可以不更新就玩,不用外挂也可以  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理