您的位置:首页 > 其它

(三)VS2010 Dll 生成与调用

2014-03-27 11:35 281 查看
    在(二)中,我们在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函数头文件即可。(隐式调用情况下)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: