为什么要使用DEF文件?

 

使用C言或者C++言来动态库,其编译器都会为每个函数甚至量生成一个对应的修名(我是这样的。原文是the decorated names),接器将编译后的目码连接成DLL,其出函数名或量名依旧是编译后的修名。并且修名是与编译器相的,也就是你的源程序C,生成的修名是一个子;如果你的源程序C++生成的修名是另一种样子。(于修名的讨论,我将放在一个独的章节进行,敬等待。粮草未,广告先行。真是的....)而我习惯是直接使用函数名,而非修名,我在用API一直就是如此。那问题就来了,比如你在VB6中使用VC6写的动态库:你先在VB6中使用函数名来描述你要用的函数,然后写好用代,接下来运行,你的VB6这时会告你,它在动态库中找不到你刚刚描述的函数的入口点,你的程序绝执行了。怎么办?解决问题的方法至少有两1、修改你的VB6对动态库输出函数的描述部分,在添加动态库输出函数的修名。2、修改你的动态库,添加一个DEF文件,并使用DEF文件的EXPORTS出你的动态库函数(在其下简单地列出你要出的函数名即可)。然,这样一来问题是解决了(没有解决?可能?有可能啦。但里先停一下,随后再。),但我有必要将该问题进步讨论下去。我动态库的目的大多是想动态库不局限于某一种编言,是了更加广泛地被用,我是喜VB写界面,而用VC来完成更重要的工作,如数据行分析、访问硬件端口等,而且VC写好的动态库很少再改VB写的界面倒是一改再改。说这么多,目的只有一个,写动态库要着眼于大局,要一切符合。什是大局?大局就是走可持续发展的道路,就是用(好象是在做政治告)。什准呢?就是符合API准(也就是使用DEF文件出函数,就象MFC动态库)。
   
,使用DEF文件来出函数的一个最主要目的就是:将编译器生成的函数修名去掉,用更加自然的、容易理解的、容易记忆的名字,而不是修名来出函数。里的名字可以不是函数名,这时须使用DEF文件的NAME格式。但由于习惯,大多情况下,只使用函数名,因为这样简单省事。是否存在偷懒的嫌疑?我的理解,不管是列函数名,是其它出名,其本上是一的,即都是使用了定文件的NAME格式。直接列函数名,就相当于函数名”=“函数修,只是可以忽略等号后面的部分,而接器会自完成函数入口的匹配和置工作。而一旦决定使用非函
数名的其它名字出函数,须书写完整的格式,即函数出名”=“出的函数修里等号后面的部分必须书写正确,否就通不了。个例子:假设动态库中一个函数描述如下,
int WINAPI TestAdd(int A,int B)
{
    return (A+B);
}

DEF文件的EXPORTS段描述如下,
EXPORTS
  TestAdd
  Add=?TestAdd@@YGHHH@Z

TestAddAdd实际上指向同一个入口。如果在VB程序TestAddAdd,其果是一的。
   
   
二、要使用WINAPI宏?
   
看看上面的例,在函数前加了一个WINAPI宏。一点很重要,它直接系着函数出什么样子的修名,使用WINAPI宏的TestAdd函数,对应出修名就是“?TestAdd@@YGHHH@Z”
   
要使用WINAPI呢?这牵涉动态库的另一个特征,协议Calling convention)。如果没有一定的协议动态库用是不可想象的。一般常用的动态库调协议有:
   __cdecl
   __stdcall
   __fastcall
协议各有各的长处不一一描述。上面在到解决VB程序VC写的动态库时,曾列解决方法,但并不一定可以实现,它取决于所使用的协议VB所遵循的是PASCAL协议,如果在动态库中没有使用相协议VB程序就会协议错。而PASCAL协议VC6中已被弃,取而代之的是__stdcall,即协议也是大多32言支持的一通用协议。在WINDOWS.HWINAPI也是被定义为__stdcall里提使用WINAPI的理由也就在,它能表达出更加多的信息----这样出函数(的协议)和 WINDOWS API函数(的协议)一
   
其它一些使用WINAPI宏的理由:你只要在所定的函数前加上宏,就不必要在再去理会各协议置。况且,你可能并不需要将所有定的函数都出,了提高行速度,你可能会将没有出的函数使用__fastcall来定了使用参,你可能使用__cdecl来定某些非出函数,或者如此的理由......需要提醒的是,VC协议__cdecl。如果你在没有修改协议的情况下,直接使用DEF文件出函数,编译连接都不会出,但是VB用的候肯定出。而如果使用了WINAPI宏,你不必再去理会些。编译器自使用WINAPI的定替代集成境里的相关设置,里函数前的最高。
   
过头来再看上面有关输出函数的修名的讨论,上面提到修名与言有,另外,它协议。如果需要使用非函数名的名字用来出,你必清楚你使用的协议种类,也就是你必清楚修名的生成规则,或者你采用一些技巧DUMPBIN.EXE工具来帮忙。

   
三、总结
   
一句,如果想建立自己的API动态库,建使用WINAPI描述你要出的函数,然后使用定文件出它

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页