DllEntryPoint

【勇芳软件工作室】汉化HomePreviousNext

DllEntryPoint函数是进入动态链接库(DLL)的可选方法。如果使用该函数,则当进程和线程被初始化和终止时,或在调用LoadLibraryFreeLibrary函数时,系统会调用该函数。DllEntryPoint是库定义函数名称的占位符。实际名称必须在构建时指定。有关更多信息,请参阅开发工具附带的文档。

BOOL WINAPI DllEntryPoint(

HINSTANCE 【hinstDLL】,//处理DLL模块
DWORD 【fdwReason】,//调用函数的原因
LPVOID 【lpvReserved】//保留
); 

参数

【hinstDLL】

DLL的句柄。该值是DLL的基址。DLL的HINSTANCE与DLL的HMODULE相同,因此【hinstDLL】可用于后续调用GetModuleFileName函数和其他需要模块句柄的函数。

【fdwReason】

指定一个标志,指示为什么正在调用DLL入口点函数。此参数可以是以下值之一:

含义
DLL_PROCESS_ATTACH 
 表示由于进程启动或调用LoadLibrary的结果,DLL附加到当前进程的地址空间。DLL可以利用此机会初始化任何实例数据或使用TlsAlloc函数分配线程本地存储(TLS)索引。
 在初始进程启动期间或调用LoadLibrary之后,操作系统将扫描加载的DLL的列表。对于尚未使用DLL_PROCESS_ATTACH值调用的每个DLL,系统调用该DLL的入口点函数。此调用是在导致进程地址空间更改的线程的上下文中进行的,例如进程的主线程或调用LoadLibrary的线程。
DLL_THREAD_ATTACH 
 表示当前进程正在创建一个新线程。发生这种情况时,系统将调用当前连接到进程的所有DLL的入口点函数。调用是在新线程的上下文中进行的。DLL可以利用此机会初始化线程的TLS插槽。使用DLL_PROCESS_ATTACH值调用DLL入口点函数的线程不会使用DLL_THREAD_ATTACH值调用DLL入口点函数。
 请注意,DLL的入口点函数只能通过在DLL附加到进程后创建的线程来调用此值。当DLL由LoadLibrary附加时,现有线程不会调用新加载的DLL的入口点函数。
DLL_THREAD_DETACH 
 表示一个线程正在干净地退出。如果DLL已经在TLS插槽中存储了指向分配的内存的指针,则会利用此机会释放内存。操作系统使用此值调用所有当前加载的DLL的入口点函数。调用是在退出的线程的上下文中进行的。在某些情况下,即使DLL没有附加到线程__,即终止线程也被调用入口点函数,因此在线程上下文中没有使用DLL_THREAD_ATTACH值调用入口点函数这两种情况:

*线程是进程中的初始线程,所以系统使用DLL_PROCESS_ATTACH值调用入口点函数。

*当调用LoadLibrary函数时,线程已经运行,所以系统从不调用该入口点函数。


DLL_PROCESS_DETACH 
 表示DLL由于清除进程退出或对FreeLibrary的调用而从调用进程的地址空间中分离出来。DLL可以利用这个机会调用TlsFree函数来释放使用TlsAlloc分配的任何TLS索引,并释放任何线程本地数据。当DLL由于进程终止或由于调用FreeLibrary而从进程中分离出来时,操作系统不会使用进程的各个线程的DLL_THREAD_DETACH值调用DLL的入口点函数。DLL只给定DLL_PROCESS_DETACH通知。DLL可以借此机会清除DLL附带和已知的所有线程的所有资源。

【lpvReserved】

指定DLL初始化和清理的其他方面。

如果【fdwReason】为DLL_PROCESS_ATTACH,【lpvReserved】对于动态加载为NULL,对于静态加载为非NULL。

如果【fdwReason】为DLL_PROCESS_DETACH,则【lpvReserved】如果DllEntryPoint已使用FreeLibrary调用,则为{9897961111},如果DllEntryPoint已在进程终止期间被调用,则为非空。

返回值

当系统使用DLL_PROCESS_ATTACH值调用DllEntryPoint函数时,如果成功则该函数返回TRUE,如果初始化失败则返回FALSE。如果调用DllEntryPoint时返回值为FALSE,因为进程使用LoadLibrary函数,则LoadLibrary返回NULL。如果在进程初始化期间调用DllEntryPoint时返回值为FALSE,则该进程将以错误结束。要获取扩展错误信息,请调用GetLastError.

当系统以除DLL_PROCESS_ATTACH之外的任何值调用DllEntryPoint函数时,返回值将被忽略。

也可以看看

FreeLibrary, GetModuleFileName, LoadLibrary, TlsAlloc, TlsFree