c++ DLL编程之二

本文详细介绍了C++中创建和使用DLL的方法,包括使用__declspec(dllexport)代替def文件导出函数,以及隐式和显式调用的区别。对于隐式调用,文章展示了如何使用extern "C"避免函数名混淆,并提供了使用头文件和lib文件的示例。同时,讨论了DLL中重载函数、全局变量和对象的处理,以及如何在不同编程语言间调用DLL。最后,指出在Windows平台上,COM是实现语言无关性的更好选择。
摘要由CSDN通过智能技术生成

__declspec(dllexport)
为每个dll写def显得很繁杂,目前def使用已经比较少了,更多的是使用__declspec(dllexport)在源代码中定义dll的输出函数。

Dll写法同上,去掉def文件,并在每个要输出的函数前面加上声明__declspec(dllexport),例如:

 

__declspec(dllexport) void FuncInDll (void)

这里提供一个dll源程序dll_withlib.cpp,然后编译链接。链接时不需要指定/DEF:参数,直接加/DLL参数即可,http://www.blogjava.net/Files/wxb_nudt/DLL_SRC.rar

 

Cl /c dll_withlib.cpp

Link /dll dll_withlib.obj

然后使用dumpbin命令查看,得到:

 

1    0 00001000 ?FuncInDll@@YAXXZ

可知编译后的函数名为?FuncInDll@@YAXXZ,而并不是FuncInDll,这是因为c++编译器基于函数重载的考虑,会更改函数名,这样使用显式调用的时候,也必须使用这个更改后的函数名,这显然给客户带来麻烦。为了避免这种现象,可以使用extern “C”指令来命令c++编译器以c编译器的方式来命名该函数。修改后的函数声明为:

 

extern "C" __declspec(dllexport) void FuncInDll (void)

dumpbin命令结果:

 

1    0 00001000 FuncInDll

这样,显式调用时只需查找函数名为FuncInDll的函数即可成功。

extern “C”
使用extern “C”关键字实际上相当于一个编译器的开关,它可以将c++语言的函数编译为c语言的函数名称。即保持编译后的函数符号名等于源代码中的函数名称。

隐式调用DLL
显式调用显得非常复杂,每次都要LoadLibrary,并且每个函数都必须使用GetProcAddress来得到函数指针,这对于大量使用dll函数的客户是一种困扰。而隐式调用能够像使用c函数库一样使用dll中的函数,非常方便快捷。

下面是一个隐式调用的例子:dll包含两个文件dll_withlibAndH.cpp和dll_withlibAndH.h。

代码如下:dll_withlibAndH.h

 

extern "C" __declspec(dllexport) void FuncInDll (void);

dll_withlibAndH.cpp

 

#include <objbase.h>

#include <iostream.h>

#include "dll_withLibAndH.h"//看到没有,这就是我们增加的头文件

extern "

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值