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 <stdio.h>#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>dlltesthModule.10000000 lpReserved.0012FD30Process attach.Simple DLL test start.Call DLL function:Test DLL values: 3Call DLL function end.Simple DLL test end.hModule.10000000 lpReserved.00000001Process detach.也就是说DLL加载和应用程序退出的使用都会调用该函数(DllMain)的哦, 是应用程序一上来就调用的,不是用到该函数时才调用的!
好象有个问题:
下面的话来源:
http://waiguai.blogdriver.com/waiguai/989918.html采用隐式链接方式,程序员在建立一个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一上来就被调用了)。
到地是为什么? 再查,再查。。。。。。