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类型,因为它的声明中没有用到上面的两个东东。
但,要保证两边声明或定义一致。