vc的dll基本用法
因为要用vc的dll,所以今天做了一些试验,还是有几点记录一下:
一.设置:
1.预处理设置:
如果有如下错误
unexpected end of file while looking for precompiled header directive
可以禁止预处理,在project=>Settings=>C/C++=>Category(Precompiled Headers)=>Not using precompiled headers。
2.预处理宏定义:
若有如下错误
definition of dllimport function not allowed
或者警告
inconsistent dll linkage. dllexport assumed.
可以增加一个预处理宏定义,在project=>settings=>c/c++=>Preprocessor definitions
添加宏定义:
,_AFXEXT
二.def文件
必须要def文件,如果没有,建一个后内容如下:
LIBRARY control.dll
DESCRIPTION winlin,chess control
EXPORTS
就可以了,
def文件用来生成lib文件的。
我采用的方式是:.dll+.lib+.h
也就是导入.h和lib,以及dll。
三.导出函数:
新建vc的dll工程control,做好上述的第一和第二步后,进入第三步。
新建一个function.h头文件,内容如下:
//function.h
//dll打印信息
extern "C"
void AFX_EXT_API dllPrint();
然后,建立它的实现文件function.cpp,内容如下:
#include<afx.h>
#include<iostream>
using namespace std;
#include<windows.h>
//dll打印信息
extern "C"
void AFX_EXT_API dllPrint()
{
cout<<"dll has been loaded."<<endl;
}
编译项目,生成control.dll和control.lib
四.使用dll中的导出函数
新建控制台工程test,先复制function.h和control.lib到test目录,
然后添加control.lib到工程连接选项:project=>settings=>link=>object/library modules添加control.lib
写main函数如下:
#include<afx.h>
#include "function.h"
void main()
{
::dllPrint();
}
编译,执行即可。
注:function.h可以只拷贝到test工程目录下,不一定要添加到test项目中去。
结果如下:
dll has been loaded.
Press any key to continue
五.导出类
新建vcdll工程control,做好第一步和第二步。
新建human.h类的头文件,内容如下:
#ifndef CN_WINLIN_CONTROL_HUMAN
#define CN_WINLIN_CONTROL_HUMAN
//人类
class AFX_EXT_CLASS Human
{
public:
void Display();
};
#endif
然后建立它的实现文件human.cpp,内容如下:
#include<afx.h>
#include<iostream>
using namespace std;
#include<windows.h>
#include "human.h"
void Human::Display()
{
cout<<"dll class Human display."<<endl;
}
编译,生成control.lib和control.dll文件。
六.使用dll中的导出类
新建控制台工程test,先复制human.h和control.lib到test目录,
然后添加control.lib到工程连接选项:project=>settings=>link=>object/library modules添加control.lib
写main函数如下:
#include<afx.h>
#include "human.h"
void main()
{
Human hm;
hm.Display();
}
编译,执行即可。
注:human.h可以只拷贝到test工程目录下,不一定要添加到test项目中去。
结果如下:
dll class Human display.
Press any key to continue