11、dll 在程序中的加载方法

一般程序要使用到dll中的函数,但是实际的dll中函数地址 的提供方法分两种,

runtime提供dll

所谓runtime提供dll,就是在程序运行时,通过修改程序中某个已载入的module的内容,让程序展现修改后的新功能。

方法:
程序运行过程中,先把需加载的dll复制一份,命名为copy.dll,把copy.dll载入到内存给程序使用。

所以,在我们自己在编写原生dll的时,这就发生了第一个文件修改操作;在程序中运行用到了copyfile操作去产生一个copy.dll文件,这是二个文件修改操作;

那么,思路就来了,我们在编写程序时,可以写2个dll文件操作的函数,一个是loadDLL,一个是UnLoadDLL。并且,每次在使用loadDLL之后,都要加一个函数,叫做检验原生DLL是否被修改函数,如果原生DLL被修改,那么copy.dll也要跟着修改;如果原生DLL没发生修改,那么你这个程序就要继续使用copy.dll中的内容;

其中,检验原生DLL是否被修改的函数,可以用文件修改时间实现,因为每次修改文件,都会留下一个新的时间标记。通过比较这个标记,就知道那个文件在最新的时间内被修改了。

Copyfile("原生.dll","copy.dll");
loadDLL("copy.dll");

while(1)
{
    
    
//如果原生dll修改时间比copydll大,那么就要重新加载copydll
	if(FileChangeTime("原生.dll","copy.dll") == 1)
	{
    
    
		UnLoadDLL("copy.dll");
		Copyfile("原生.dll","copy.dll");
		loadDLL("copy.dll");
	}
}

注意,为了使用在copy.dll中的函数,必须指定一个指针去接收这个函数地址,再进行dll功能的调用。这个指针接收函数地址的操作是在loadDLL中完成的。

//head.cpp
#include "head.h"
extern "C" GAME_UPDATE_AND_RENDER(GameUpdateAndRender)
{
    
    
	actuall func Code for the head.dll output
	...
}
//head.h
#define GAME_UPDATE_AND_RENDER(name) void name(int a,int b)
typedef GAME_UPDATE_AND_RENDER(game_update_and_render);

#include "head.h"

int main()
{
    
    
	Copyfile("原生.dll","copy.dll");
	loadDLL("copy.dll");
	
	while(1)
	{
    
    
		sleep(500);
		if(FileChangeTime("原生.dll","copy.dll") == 1)
		{
    
    
			UnLoadDLL("copy.dll");
			Copyfile("原生.dll","copy.dll");
			loadDLL("copy.dll");
		}
	}
	return 1;
}

静态提供dll

直接用个macro,把整个dll都抓到cpp中,
#progama load(dll)
技术较为拙劣,不解释

猜你喜欢

转载自blog.csdn.net/weixin_42557786/article/details/107870080