当前位置: 首页 > 编程技术 > 正文

动态调用DLL导出函数

    要实现动态加载DLL,首先要加载的DLL必须有导出函数,一般而言,在编写DLL后,如果不加任何的改变的话,那么DLL的导出表函数的名称将会相当的奇怪,比如如果是我在DLL里面定义了int DllTest(void)的函数,那么编译完成后,通过LordPE查看dll的导出函数,你会发现,DLLtest的导出函数变成了下面的这个样子:
DLL导出函数

我们注意到,在函数名称后面多了很多的符号,要实现动态加载DLL,首先要做的事情就是导出需要导出的函数

1.导出需要的函数

在编写DLL完成后,通过新建一个DEF文件,并指定要导出的函数就可以将函数导出,并且导出的函数的名称和函数原型是一样的

选择文件->新建->选择文本文档->文件名取为任意文件名,但是后缀一定要加上.DEF

在新建的DEF文件中加入下面的内容:

EXPORTS
        DLLTest

然后直接编译即可, 编译完成后,我们通过LordPE查看导出函数,可以发现导出函数的名称和我们声明的名称已经是相同的了

2.动态加载DLL

新建一个WIN32的控制台工程,将DLL拷贝到工程的根目录下,

然后在CPP文件里面书写下面的代码:

#include <Windows.h>
typedef   void   (*PFNEXPORTFUNC)   (LPCTSTR);
void main()
{
	HMODULE hModule = ::LoadLibrary(".\\DllTest.dll"); /* 得到DLL载入的基址 */
	if(hModule != NULL){
		PFNEXPORTFUNC mExportFunc = (PFNEXPORTFUNC)::GetProcAddress(hModule,"ExportFun");  /* 根据函数名称得到函数的虚拟地址(VA) */

		if(mExportFunc != NULL){
			mExportFunc("");
		}
	}
	FreeLibrary(hModule);                    /* 卸载DLL库 */
}

其中,LoadLibrary的参数就是dll的路径,GettProcAddress的第一个参数是通过LoadLibrary或得到基址,第二个参数就是函数的名称

通过这两个函数,就可以实现动态调用DLL了



本文固定链接: http://kuaile.in/archives/1136 | 蒲公英的博客

该日志由 蒲公英 于2012年08月02日发表在 编程技术 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 动态调用DLL导出函数 | 蒲公英的博客
关键字: ,

动态调用DLL导出函数:等您坐沙发呢!

发表评论


You must enable javascript to see captcha here!

快捷键:Ctrl+Enter