dllmain的使用:
dllmain函数是dll模块的默认入口点。当windows加载dll模块时调用这一函数。系统首先调用全局对象的构造函数,然后调用全局函数 dllmain。dllmain函数不仅在将dll链接加载到进程时被调用,在dll模块与进程分离时(以及其它时候)也被调用。下面是一个框架 dllmain函数的例子。
如果我们在dllmain中写入下面的代码(在原来的gandll.c中添加下面的代码):
bool apientry dllmain(handle hmodule, dword ul_reason_for_call, lpvoid lpreserved)
{
printf("hmodule.%p lpreserved.%p \n", hmodule, lpreserved);
switch (ul_reason_for_call)
{
case dll_process_attach:
printf("process attach. \n");
break;
case dll_process_detach:
printf("process detach. \n");
break;
case dll_thread_attach:
printf("thread attach. \n");
break;
case dll_thread_detach:
printf("thread detach. \n");
break;
}
return (true);
}
同时将dlltest\dlltest.c修改为:
#include
#include "dlltest.h"
int main(int argc, char **argv)
{
printf("simple dll test start. \n");
printf("call dll function: \n");
printf("test dll values: %d \n", add2(1, 2));
printf("call dll function end. \n");
printf("simple dll test end. \n");
return (0);
}
我简单的测试一下输出结果为:
c:\gandll\dlltest>dlltest
hmodule.10000000 lpreserved.0012fd30
process attach.
simple dll test start.
call dll function:
test dll values: 3
call dll function end.
simple dll test end.
hmodule.10000000 lpreserved.00000001
process detach.
也就是说dll加载和应用程序退出的使用都会调用该函数(dllmain)的哦, 是应用程序一上来就调用的,不是用到该函数时才调用的!
好象有个问题:
下面的话来源:
采用隐式链接方式,程序员在建立一个dll文件时,链接程序会自动生成一个与之对应的lib导入文件。该文件包含了每一个dll导出函数的符号名和可选的标识号,但是并不含有实际的代码。lib文件作为dll的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与lib文件中导出符号相匹配,这些符号或标识号进入到生成的exe文件中。lib文件中也包含了对应的dll文件名(但不是完全的路径名),链接程序将其存储在exe文件内部。当应用程序运行过程中需要加载dll文件时,windows根据这些信息发现并加载dll,然后通过符号名或标识号实现对 dll函数的动态链接。
我们看他说的“当应用程序运行过程中需要加载dll文件时”, 我做的实验测试的是,在输出
simple dll test start.
call dll function:
这两行应该是不需要dll的啊, 怎么应用程序在前面输出了:
hmodule.10000000 lpreserved.0012fd30
process attach.
这个呢? 这就说明其实应用程序一上来就调用了dll的(还有一种可能就是他是正确的,由于编译器优化的原因使的该dll一上来就被调用了)。
到地是为什么? 再查,再查。。。。。。
阅读(11293) | 评论(0) | 转发(2) |