口函数,不需要编写自己的DLL
入口函数,用这个默认的入口函数就能使动态链接库在被调用时初始化。如果应用程序的
DLL 需要分配额外的内存或资源,即对每个进程或线程初始化和清除cāo作时,就需要在相应
的DLL 工程的CPP 文件中对DllMain()函数按照下面的格式书写,代码如下:
BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch( ul_reason_for_call )
{
case DLL_PROCESS_ATTACH:
.......
case DLL_THREAD_ATTACH:
.......
case DLL_THREAD_DETACH:
.......
case DLL_PROCESS_DETACH:
.......
}
return TRUE;
}
注意:函数名DllMain 是区分大小写的。许多编程人员有时调用的函数是DLLMain。这是一个非
常容易犯的错误,因为DLL 这个词常常使用大写来表示。如果调用的进入点函数不是
DllMain,而是别的函数,代码将能够编译和链接,但是其进入点函数永远不会被调用,
DLL 永远不会被初始化。
参数hinstDll 包含了DLL 的实例句柄。与(w)WinMain 函数的hinstExe 参数一样,这个
值用于标识DLL 的文件映像被映shè到进程的地址空间中的虚拟内存地址。通常将这个参数保
枫叶文学网www.fywxw.com
Visual C++ 6.0 程序设计从入门到精通
·254·
存在一个全局变量中,这样就可以在调用加载资源函数(如DialogBox 和LoadString)时使
用它。最后一个参数是fImpLoad,如果DLL 是隐含加载的,那么该参数将是个非0 值,如
果DLL 是显式加载的,那么它的值是0。
参数fdwReason 用于指明系统为什么调用该函数。该参数可以使用
DLL_PROCESS_ATTACH( 进程被调用)、DLL_THREAD_ATTACH( 线程被调用)、
DLL_PROCESS_DETACH(进程被停止)、DLL_THREAD_DETACH(线程被停止)4 个值的
其中之一,lpReserved 为保留参数。下面就具体介绍这4 个值的意义。
1.DLL_PROCESS_ATTACH 通知
当DLL 被初次映shè到进程的地址空间中时,系统将调用该DLL 的DllMain()函数,给它
传递参数fdwReason 的值DLL_PROCESS_ATTACH。只有当DLL 的文件映像初次被映shè时,
才会出现这种情况。如果线程在后来为已经映shè到进程的地址空间中的DLL 调用
LoadLibrary(Ex) 函数, 那么cāo作系统只是递增DLL 的使用计数, 它不会再次用