一、编写
VisualStudio,新建项目,选Win32项目,命名,然后确定
然后直接点“下一步”
然后选择“DLL”和“空项目”,然后“完成”。
创建头文件,代码如下:
#pragma once;
#ifdef DLL_IMPLEMENT
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
DLL_API int add(int x, int y); //简单方法
还有另一种头文件的格式:
#ifndef _Demo_H_
#define _Demo_H_
#include <string.h>
#include <stdio.h>
#ifdef LIBDLL
#define LIBDLL extern "C" _declspec(dllimport)
#else
#define LIBDLL extern "C" _declspec(dllexport)
#endif
LIBDLL int Add(int n, int x);
#endif
然后创建对应的.cpp文件:
#define DLL_IMPLEMENT
#include "Test.h"
int DLL_API add(int x, int y)
{
return x+y;
}
对应第二种头文件定义,.cpp文件如下:
#include "test.h"
int Add (int n, int x)
{
return n + x;
}
然后右键单击工程名,选择“生成”。
然后在解决方案或者项目的Debug文件夹下可以找到项目名称.dll文件。
二、使用dll
1、显式调用
新建win32控制台项目,将上述生成的.dll文件放在新项目的Debug文件夹下即可以使用。
创建一个.cpp文件,代码如下:
#include <Windows.h>
#include <iostream>
using namespace std;
typedef int(*ADD)(int,int); //定义函数指针,格式与库里的函数相同,通过函数指针来引用dll库里的函数
typedef int(*ID)(int,char*, char*, char*, char*, char*);
int main()
{
//HINSTANCE handle = LoadLibrary(L"DLLTest.dll"); //加L是避免LPCWSTR之类的报错
HINSTANCE handle = LoadLibrary(L"CreateDLL.dll"); //加L是避免LPCWSTR之类的报错
//将Dll文件放到生成的exe文件相同的目录下,默认是project
//下的debug文件夹下。
ADD add_function = (ADD)GetProcAddress(handle,"add"); //通过上面的HINSTANCE来获取、指向dll库里的函数
cout<<add_function(2,3)<<endl;
cout<<"end"<<endl;
/*
int result;
HINSTANCE handle = LoadLibrary(L"CNSLDLL.dll");
ID id_function = (ID)GetProcAddress(handle,"id");
char bank_id[10]; char bank_name[50]; char provice[15]; char city[15]; char address[100];
cout<<id_function(15,bank_id, bank_name, provice, city, address)<<endl;
*/
//cout<<id_function(5,6)<<endl;
}
运行即可。
2、隐式调用
隐式调用需要使用.h, .lib, .dll三件套。
新建一个项目,在VC++目录的“包含目录”里添加链接库头文件的所在目录,在“库目里”添加.lib文件所在的目录。
然后在“链接器”->“输入”->“附加依赖项”中添加.lib文件的名称。
最后和显式调用一样,将.dll文件放在新项目中的Debug目录下,然后在代码中直接include头文件,然后调用函数即可
#include <iostream>
#include <test.h>
using namespace std;
int main(int argc, const char * argv[]){
cout<<Add(5,11)<<endl;
}
显式调用的不足是,如果只给了dll(没有接口),是没有办法使用dll的。另外dll的显式链接是不支持导出类和变量的。
另外可以使用vs的bin目录下的dumpbin来查看dll的函数。