DLL程序的创建和调用方法

DLL(动态链接库),是一种可以被其他应用程序调用的程序模块,其中封装了可以调用的资源或函数,一个DLL文件可以被多个进程调用。动态链接库是在exe文件运行的时候被加载执行的,动态链接库可以减少可执行文件的体积,在需要的时候进入内存,将软件划分为多个模块,可以按照模块进行开发,当然在网络安全方面可以进行对某个特定进程的DLL注入。

DLL程序的入口函数不是main()或者WinMain()函数,而是DllMain()函数:

hModule:当前模块的实力句柄

ul_reason_for_call:表示该参数被调用的原因

lpResered:保留参数,不被程序员所使用

BOOL APIENTRY DllMain( HMODULE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved )
{
	switch (ul_reason_for_call)  
	{
	case DLL_PROCESS_ATTACH:  //当DLL被某进程加载时,DllMain()被调用
		break;
	case DLL_THREAD_ATTACH:   //当进程中有线程创建时,DllMain()被调用
		break;
	case DLL_THREAD_DETACH:    //当进程中有线程结束时,DllMain()被调用
		break;
	case DLL_PROCESS_DETACH:   //当DLL被某进程卸载时,DllMain()被调用
		break;
	}
	return TRUE;
}

DllMain()函数可以调用多次,根据调用情况的不同,需要执行不同的代码,比如当进程加载该DLL文件时,在DLL中要申请一些资源,所以在卸载DLL的时候,需要对先前申请的资源进行释放。

注意如果DLL在具体使用的时候如果不考虑DLL文件的加载的话,DllMain()函数是可以不存在的。

DLL的调用有两种方法:静态调用、动态调用。静态调用是通过连接器将DLL函数的导出函数写进可执行文件中,而动态调用不是在连接时完成的,而是在运行中完成的,动态调用能更加有效的使用内存,试编写大型应用程序的重要方式,实际需要时才会加载相应的DLL,用完之后就释放该模块。

下边步骤一定要仔细看:

一:动态调用:

1.在vs中,添加新建项目-》控制台应用程序-》勾选 DLL选项,即可自动生成基本的DLL代码,其中dllmain文件中就有上述代码。************************在生成的和dll项目同名的cpp中可以直接添加实现dll中的函数。*************8**

扫描二维码关注公众号,回复: 8864206 查看本文章

2.右击dll项目添加新建项-》可以看到:

3.添加之后:在其中写入如下:

MyMessageBox  是我写的要导出 的函数名 @1  就是导出的第一个  如果到处更多个  就在第二行 写上函数名+@2

LIBRARY
EXPORTS
	MyMessageBox @1

4.点击重新生成解决方案,在DLL项目文件夹下Debug文件中找到.dll文件和.lib文件粘贴复制到想要加载该DLL的项目文件夹下的Debug中。****************************************一定不要忘记

5.在解决方案下另外建一个正常的项目:

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

using namespace std;
                                 //定义一个函数指针 最后的括号为空就是函数没有参数
typedef VOID(*PFUNMYMESSAGE)();  //如果有参数就向其中添加

void main()
{
	HMODULE hMODULE = LoadLibrary(TEXT("Dll.dll")); //获得目标dll的模块句柄
	if (!hMODULE)
	{
		return;
	}
        //得到目标函数的函数地址
	PFUNMYMESSAGE MyMessageBox = (PFUNMYMESSAGE)GetProcAddress(hMODULE,"MyMessageBox");

	MyMessageBox();  //调用
	return;
}

2.静态调用:  在与DLL项目同名的cpp中添加自己的函数:

//给dll添加一个导出的函数
extern "C" __declspec(dllexport) VOID MyMessageBox(); 

VOID MyMessageBox()
{
	char  FilePathName[MAX_PATH] = { 0 };
	GetModuleFileName(NULL, (LPWSTR)FilePathName, MAX_PATH);//得到当前应用程序文件位置
	MessageBox(NULL, (LPWSTR)FilePathName, NULL, MB_OK);
	return;
}

然后在想要加载项目中:

*********不要忘记***********

如果是同一个解决方案下不同项目:在想要加载的项目:右击-》添加-》引用-》将想要引用的DLL勾上,在main函数中:

如果是不同解决方案下:右击项目-》属性-》连接器-》输入-》附加依赖项:填上DLL.lib的完整路径然后记得重点:要把DLL.dll文件复制到想要加载该DLL的项目的Debug文件夹下


# include <Windows.h>
# pragma comment (lib,"DLL.lib")   //连接目标DLL库
extern "C" VOID MyMessageBox(); //将函数接过来
using namespace std;
void main()
{

	MyMessageBox();  //这里就可以直接调用
	return;
}
发布了37 篇原创文章 · 获赞 12 · 访问量 9260

猜你喜欢

转载自blog.csdn.net/weixin_43265881/article/details/103543773