【VC编程技巧】动态链接库?1.2用模块导出接口
为什么要用模块(def文件)导出接口呢?
第一步,我先从函数调用方式说起,大家都知道函数调用有几种常见的方式,分别是__cdecl,__stdcall(pascall),__fastcall,和thiscall。下面我说一下这几种方式会在那些场合出现和它们的差异:
综上 ,我们知道Dll要有良好的共性接口的调用约定应该是__stdcall,而如果只是C来用的话可以约定为__cdecl;
第二步,当我们编写__stdcall形式的接口时,大家都知道C++编译器会对函数名做修改,使我们Dll的共性降低(只能在同一种编译器生成的模块之间调用)。
而通过关键字extern "C" __declspec(dllexport)可以保证__cdecl约定方式的函数名称不被改变,却不能保证__stdcall约定方式的函数。这样我们会因为__stdcall函数名称被修改,不能通过函数名来调用接口函数;
第三步,现在可以回答文章开头的问题了,因为向Dll中引入模块的正好解决了上面的问题(保证__stdcall约定方式的函数名称不变),同时它使接口形式更加清晰,为程序员带来了很大帮助。
第四步,我举个例子验证一下这个结论:关键字extern "C" __declspec(dllexport)可以保证__cdecl约定方式的函数名称不被改变,却不能保证__stdcall约定方式的函数。
第五步,我们来证明向DLL中引入模块是可以解决这个问题的。
总的来说,编写动态库函数调用方式推荐__stdcall,接口导出时采用模块导出。