资料来自MSDN
动态链接库 (DLL) 的可选入口点。 当系统启动或终止进程或线程时,它将使用进程的第一个线程为每个加载的 DLL 调用入口点函数。 使用 LoadLibrary 和 FreeLibrary 函数加载或卸载 DLL 时,系统还会调用 DLL 的入口点函数。
示例
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved ) // reserved
{
// Perform actions based on the reason for calling.
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
// Initialize once for each new process.
// Return FALSE to fail DLL load.
break;
case DLL_THREAD_ATTACH:
// Do thread-specific initialization.
break;
case DLL_THREAD_DETACH:
// Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH:
if (lpvReserved != nullptr)
{
break; // do not do cleanup if process termination scenario
}
// Perform any necessary cleanup.
break;
}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}
这是 动态链接库Entry-Point函数中的一个示例。
警告
对于在 DLL 入口点中可以安全地执行的操作,通常存在很大限制。 请参阅有关在 DllMain 中调用不安全的特定 Windows API 的 一般最佳做法 。 如果需要进行复杂的初始化,可在 DLL 的初始化函数中完成。 可以要求应用程序在 DllMain 运行之后以及调用 DLL 中的任何其他函数之前调用初始化函数。
语法
参数
hinstDLL [in]
DLL 模块的句柄。 值是 DLL 的基址。 DLL 的 HINSTANCE 与 DLL 的 HMODULE 相同,因此可以在调用需要模块句柄的函数时使用 hinstDLL 。
fdwReason [in]
指示调用 DLL 入口点函数的原因代码。 此参数的取值可为下列值之一:
| 值 | 含义 |
|---|---|
| DLL_PROCESS_ATTACH 1 | 由于启动进程或调用 LoadLibrary,DLL 正在加载到当前进程的虚拟地址空间中。 DLL 可以利用此机会初始化任何实例数据,或使用 TlsAlloc 函数分配线程本地存储 (TLS) 索引。lpvReserved 参数指示 DLL 是静态加载还是动态加载。 |
| DLL_PROCESS_DETACH 0 | DLL 正在从调用进程的虚拟地址空间中卸载,因为它加载失败,或者引用计数已达到零, (进程在每次调用 LoadLibrary) 时终止或调用 FreeLibrary 一次。lpvReserved 参数指示是否由于 FreeLibrary 调用、加载失败或进程终止而卸载 DLL。DLL 可以利用此机会调用 TlsFree 函数,以释放使用 TlsAlloc 分配的任何 TLS 索引,并释放任何线程本地数据。请注意,接收 DLL_PROCESS_DETACH 通知的线程不一定是接收 DLL_PROCESS_ATTACH 通知的线程。 |
| DLL_THREAD_ATTACH 2 | 当前进程正在创建新线程。 发生这种情况时,系统会调用当前附加到进程的所有 DLL 的入口点函数。 调用在新线程的上下文中进行。 DLL 可以利用此机会初始化线程的 TLS 槽。 使用 DLL_PROCESS_ATTACH 调用 DLL 入口点函数的线程不会使用 DLL_THREAD_ATTACH 调用 DLL 入口点函数。请注意,只有进程加载 DLL 后创建的线程才能使用此值调用 DLL 的入口点函数。 使用 LoadLibrary 加载 DLL 时,现有线程不会调用新加载的 DLL 的入口点函数。 |
| DLL_THREAD_DETACH 3 | 线程正在完全退出。 如果 DLL 在 TLS 槽中存储了指向已分配内存的指针,则它应利用此机会释放内存。 系统使用此值调用当前加载的所有 DLL 的入口点函数。 调用是在退出线程的上下文中进行的。 |
lpvReserved [in]
如果DLL_PROCESS_ATTACH fdwReason,则 lpvReserved 对于动态加载为 NULL,对于静态加载为非 NULL。
如果 fdwReasonDLL_PROCESS_DETACH,如果调用了 FreeLibrary,则 lpvReserved 为 NULL,或者 DLL 加载失败;如果进程正在终止,则为非 NULL。
返回值
当系统使用DLL_PROCESS_ATTACH值调用 DllMain 函数时,如果成功,则函数返回 TRUE;如果初始化失败,则返回 FALSE。 如果由于进程使用 LoadLibrary 函数而调用 DllMain 时返回值为 FALSE,则 LoadLibrary 返回 NULL。 (系统使用 DLL_PROCESS_DETACH 立即调用入口点函数并卸载 DLL.) 如果在进程初始化期间调用 DllMain 时返回值为 FALSE,则进程将终止并出现错误。 要获得更多的错误信息,请调用 GetLastError。
当系统使用除 DLL_PROCESS_ATTACH 以外的任何值调用 DllMain 函数时,将忽略返回值。
备注
DllMain 是库定义的函数名称的占位符。 必须指定生成 DLL 时使用的实际名称。 有关详细信息,请参阅开发工具附带的文档。
| 要求 | 值 |
|---|---|
| 最低受支持的客户端 | Windows XP [仅限桌面应用] |
| 最低受支持的服务器 | Windows Server 2003 [仅限桌面应用] |
| 标头 | Process.h |