DLL动态链接库导出函数方法 -- 动态导出(.def文件导出)

简介

动态链接库最大的优势在于可以提供给其他应用程序共享的资源,最小化应用程序代码的复杂度,其中一个十分重要的功能就是dll可以导出封装函数的功能。导出函数有两种主要方式,分别是静态导入动态导入,本文主要介绍动态导入功能。

方法解析

(1)创建DLL动态链接库项目
创建DLL动态链接库项


(2)在DllMain函数的上方或下方创建一个自定义函数(样例使用ShowMessageBox函数)

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"

BOOL APIENTRY DllMain(HMODULE hModule,
	DWORD  ul_reason_for_call,
	LPVOID lpReserved
)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
	case DLL_THREAD_ATTACH:
	case DLL_THREAD_DETACH:
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}

int ShowMessageBox(const WCHAR* lpText, const WCHAR* lpCaption)
{
	MessageBox(NULL, lpText, lpCaption, 0);
	return 0;
}


(3)创建.def文本文件
创建.def文本文件

Text.def文件代码如下:

LIBRARY DemoDLL
EXPORTS
	ShowMessageBox

(4)如果是VS平台,必须要在连接器中添加.def文件 ![路径:项目属性 => 链接器 => 输入 => 模块定义文件 => 输入.def文件的文件名](https://images2018.cnblogs.com/blog/1196392/201808/1196392-20180824184513098-1239015728.png)

(5)编译生成dll和lib文件
编译生成dll和lib文件


(6)编写测试程序

#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <Windows.h>

using namespace std;

typedef int(*ShowMessageBox)(const WCHAR* lpText, const WCHAR* lpCaption);   //声明函数指针,告诉程序从动态链接库导入的地址是什么类型的函数

int main(void)
{
	HMODULE hm = LoadLibrary("DemoDLL.dll");			//加载动态链接库
	if (hm == NULL)
	{
		printf("Library Error !\n");
		system("pause");
		return 0;
	}
	ShowMessageBox SMessageBox = (ShowMessageBox)GetProcAddress(hm, "ShowMessageBox");   //查找函数地址
	if (SMessageBox == NULL)
	{
		cout << GetLastError() << endl;
		printf("GetProcAddress error \n");
		system("pause");
		return 0;
	}
	SMessageBox(L"HelloWorld", L"Tip");			//使用dll中导出的函数
	FreeLibrary(hm);
	return 0;
}

(7)执行成功
程序运行画面

posted @ 2018-08-24 18:48  倚剑问天  阅读(699)  评论(0编辑  收藏  举报