Vc++制作通用dll动态链接库并调用

step1
文件-新建-vc+±win32-dll
step2
头文件声明省略,
导出函数 只要头文件就可以了不需要源文件中
cpp源码:

#include "stdafx.h"
#include "mydll.h"

//使用c的导出方式       winapi 使用的调用规则也是__stdcall 还要在 def 文件声明导出函数
extern "C" MYDLL_API  int _stdcall GetMaxNumber(int a, int b)
{
	return a + b;
}

extern "C" MYDLL_API void _stdcall ShowMsg(char * text, char* title)
{
	MessageBoxA(NULL, text, title, MB_OK);

}

MYDLL_API 是 define MYDLL_API __declspec(dllexport)

这样其他语言还不能用,还要源文件-添加.def 声明导出函数
LIBRARY
EXPORTS
GetMaxNumber @ 1
ShowMsg @ 2

LIBRARY 后面可以跟输出的dll名字
@后面的是导出函数的序号 比如1 就是第一个

方式二,不使用标准的dll 使用mfc的dll
使用mfc的dll导出dll非常简单,
第一种使用c的方式导出 不需要注明调用方式
第二种直接在.def中写导出函数和上面一样


extern "C" __declspec(dllexport) void netbios() //MFC DLL 导出函数和 32dll不一样不需要 注明调用方式
{
	MessageBoxA(NULL, "nini", "caption", 0);
	// 如果对话框无法显示,此处需要加下面这行代码,不然对话框显示不出来。???
	//AFX_MANAGE_STATE(AfxGetStaticModuleState());

}

我在查阅书籍的时候发现了另外一种的导出函数的方式:
#pragma comment(linker,"/export:要导出的名字=实际导出的名字");
参数一:要导出的名字,比如我要导出一个名字为:myfunction的方法,
参数二:实际导出的函数。我们知道使用c++或者c+的方式默认 调用模式的都会改变函数名字 比如_@myfuntion@0这样的那就是这个
不论是c还是c++导出名字的乱码都是有可以理解的意义并不是真的乱码。
使用这种方法导出的函数是两个而不是一个
如图:Vc++制作通用dll动态链接库并调用_第1张图片

extern MYDLLEXPORT_API int nMydllExport;
#pragma comment(linker,"/export:fn=?fnMydllExport1@@YAHXZ")
MYDLLEXPORT_API  int   fnMydllExport1(void);

这个方法还可以用于转发,比如自己要导出的函数不在自己的dll中,自己的dll只是一个接口 实际实现是在别的dll中,
#pragma comment(linker,"/export:导出的接口名字=实现模块名字.名字 ");例子如下

extern MYDLLEXPORT_API int nMydllExport;
\#pragma comment(linker,"/export:fn=dllwork.aa")
MYDLLEXPORT_API  int   fnMydllExport1(void);

Vc++制作通用dll动态链接库并调用_第2张图片

调用dll
这里只讲一种调用方式,可以调用所有标准的dll,也叫动态调用。
1.使用LoadLibrary加载动态库获得内存地址
2.GetProcAddress获得需要调用的函数地址
3.声明一个指针来接收2的地址
4.使用指针调用
5.释放

	HMODULE hdll = LoadLibrary(L"C:\\Users\\Administrator\\Desktop\\12.dll"); // 加载动态库
	typedef void(WINAPI *CSayhi) ();  //定义一个无返回值 指向空参数方法的指针
	CSayhi say = (CSayhi)GetProcAddress(hdll, "SayHello");
	say();
	FreeLibrary(hdll);//释放dll

总结:
1.使用标准的的方式导出函数名称必须 注明调用方式 def中写明导出符号和顺序(生成的dll比较小)
2.使用mfcdll导出函数比较简单只需要在def中写名导出符号,或者使用c的方式导出不需要写明调用方式(这种方式的生成的dll体积比方式1生成的dll体积大非常多,这也是为什么那么多人不爱用mfc的原因)
3.这种方式使用过

聊天交友/修仙练级群:709332479

你可能感兴趣的:(c++)