一般程序要使用到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)
技术较为拙劣,不解释