在(二)中,我们在Dll 的头文件里面 有:
#ifndef _Dll_H
#define _Dll_H _declspec(dllimport)#else
#endif
_Dll_H int add( int a, int b );
_Dll_H int subtract( int a, int b );
其实这是C调用约定,有时我们为了能够将C语言写的Dll用在C++项目中,这时我们可以将头文件改为:
#ifndef _Dll_H
#define _Dll_H extern "C" _declspec(dllimport)
#else
#endif
_Dll_H int add( int a, int b );
_Dll_H int subtract( int a, int b );
但是如果我们调用工程(也就是客户端)用的是WINAPI标准调用约定(pascal调用约定);那么这个时候 就算用上面的方法也没用,因为调用标准不一致;如:
#ifndef _Dll_H
#define _Dll_H extern "C" _declspec(dllimport)
#else
#endif
_Dll_H int _stdcall add( int a, int b );
_Dll_H int _stdcall subtract( int a, int b );
对应的.cpp函数前面 也加上_stdcall, 这个时候生成的Dll函数名字还是改编了,所以在pascal调用标准中当然无法识别,当然会链接失败!
这个时候 我们就可以创建一个 .def 文件,添加如下代码即可
LIBRARY Dll
EXPORTS
add
subtract
这个时候其他的什么都不用改,头文件 也不要改,可以直接用了。
有了.def 文件 那么dll文件的 函数导出就没问题了, 所以在Dll项目中 就没必要dll头文件 申明导出函数了。只需要在调用工程中写一个导入dll函数头文件即可。(隐式调用情况下)