DLL的导出与使用 C++

一、DLL中导出函数的声明

1、在函数声明中加上__declspec(dllexport)

在需要导出的函数之前加__declspec(dllexport)即可。

#include 
using namespace std;

__declspec(dllexport) int add(int a, int b)
{
	return a + b;
}
__declspec(dllexport) int sub(int a, int b)
{
	return (a - b);
}

显式链接还需加上extern "C",否则必须调用者必须使用一个处理后的字符串进行调用,具体在下文使用DLL中。

2、模块定义(.def) 文件声明

C++代码:

#include 
using namespace std;

int _stdcall add(int a, int b)
{
	return a + b;
}
int __stdcall sub(int a, int b)
{
    return a - b;
}

新建一个DllDef.def文件,内容是

 LIBRARY DllDef
 EXPORTS  
 add 
 sub

 

二、应用程序调用DLL

显式链接不需要.h和.lib,只需dll即可。显式链接在需要时LoadLreeibrary不需要时FreeLibrary即可。

隐式链接需要.h和.lib和.dll,且dll随主进程始终占用内存。

1、显式链接

1、def声明

#include 
#include 
#include 
using namespace std;

typedef int(_stdcall* Add)(int, int);
int main()
{
	HINSTANCE hInstance = LoadLibrary(TEXT("DllDef.dll"));
	if (!hInstance)
	{
		cout << "not found" << endl;
		return 0;
	}
	Add add = (Add)GetProcAddress(hInstance, "add");
	if (add == NULL)
	{
		cout << "GetProcAddress Error" << GetLastError() << endl;
		return 0;
	}
	cout << add(1, 2);
        FreeLibrary(hInstance);

	return 0;
}

可以正常使用。

2、在函数声明中加上__declspec(dllexport)

不改变原来的代码,直接编译,成功,但是运行会报错127(找不到指定的程序)。

所以需要修改dll生成那里的代码函数声明加上extern "C"

#include 
using namespace std;

extern "C" __declspec(dllexport) int add(int a, int b)
{
	return a + b;
}
extern "C" __declspec(dllexport) int sub(int a, int b)
{
	return a - b;
}

然后修改代码去掉_stdcall

#include 
#include 
#include 
using namespace std;

typedef int(* Add)(int, int); //这里进行了改动,去掉了_stdcall
int main()
{
	HINSTANCE hInstance = LoadLibrary(TEXT("DllDef.dll"));
	if (!hInstance)
	{
		cout << "not found" << endl;
		return 0;
	}
	Add add = (Add)GetProcAddress(hInstance, "add");
	if (add == NULL)
	{
		cout << "GetProcAddress Error:" << GetLastError() << endl;
		return 0;
	}
	cout << add(1, 2);
	FreeLibrary(hInstance);

	return 0;
}

2、隐式链接

前面加上#pragma comment(lib,"xxx.lib")

并且包含.h文件

1、def声明

要注意def内的LIBRARY后的名字。并且要把.h中可能存在的extern "C"去掉。

主程序:

#include 
#include 
#include 
#include "main.h"
using namespace std;

#pragma comment(lib,"DllDef.lib")
//extern "C" _declspec(dllimport) int add(int, int);
int main()
{
	cout << add(1, 2);

	return 0;
}

main.h:

#pragma once
int _stdcall add(int a, int b);
int __stdcall sub(int a, int b);

2、在函数声明中加上__declspec(dllexport)

主程序:

#include 
#include 
#include 
#include "main2.h"
using namespace std;

#pragma comment(lib,"Dllexport.lib")
//extern "C" _declspec(dllimport) int add(int, int);
int main()
{
    cout << add(1, 2);

    return 0;
}

main2.h:

#pragma once
extern "C" __declspec(dllexport) int add(int a, int b);
extern "C" __declspec(dllexport) int sub(int a, int b);

 

你可能感兴趣的:(DLL的导出与使用 C++)