C/C++编写dll动态链接库使用操作与非基本类型参数声明错误

在VC6.0 下编译通过。。。其它VC平台类似!

一、建立 Win32 Dynamic-Link Library 项目

【dll.cpp】

#include <iostream>
#include <string>

#include "dll.h"

using namespace std;

void add(char* aa)
{
 string bb = aa;
 cout << "you are right!" << "------" << bb <<endl;
}

【dll.h】

 

#include <iostream>

using namespace std;

extern "C" _declspec(dllexport) void add(char* aa);

build之后没有错误就成了,在项目debug目录下生成*.dll和*.lib两文件

二、使用动态链接库要用到上面两生成的文件和dll.h头文件,共三文件。

1、把.lib\.h文件拷贝工程目录下,把dll文件拷贝到debug目录下
2、把lib加入到工程(工程-设置-连接)也可以用代码动态添加
3、包含头文件后就可以使用导出的库函数了。

在上面的cpp文件可以已经看出,在传递参数的时候,为什么把指针aa的值符给string bb使用,而不直接传进string类型的参数呢?在跨dll使用template/STL或者自定义类型时一般是会出现声明错误的,甚至更严重。因此,最好使用基本类型的参数进行传递。还有,dll和主程序之间是相对独立的,各自的内存堆栈分配也是独立的。

在windows核心编程中明确的说了在dll中如果申请了内存空间,就一定要在dll中释放这块内存空间。在exe和dll都静态链接到C/C++运行时库的时候,exe和dll都有各自的堆(heap)空间,所以各自申请的内存需要各自释放。

如果一定要使用非基本类型,也是有办法的。。。如果用容器的话,直接传就可以了(不用管容器里边是什么,只要保证两边编译的stl库一样);而且尽可能用引用,或者const修饰。
对于string类型我到现在还不知道怎么传,如果有谁知道可以告诉我,感激不尽。。

PS:对于windows下的DLL封装的函数调用时,或者想通过DLL将函数输出时,任何非基本类型的参数,都需要用__declspec(dllexport)和__declspec(dllimport) 。这具体是什么含义呢,就是如果参数里面出现了类(非基本的类型,非int ,char,bool之类的),都需要用上面两个声明来定义这个参数的类。例如DLL永远不能输出参数string类型,因为它的声明中没有用到上面的两个东东。
但,要保证两边声明或定义一致。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值