DLL的导出与使用 C++

一、DLL中导出函数的声明

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

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

#include <iostream>
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 <iostream>
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 <iostream>
#include <Windows.h>
#include <vector>
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 <iostream>
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 <iostream>
#include <Windows.h>
#include <vector>
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 <iostream>
#include <Windows.h>
#include <vector>
#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 <iostream>
#include <Windows.h>
#include <vector>
#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);

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值