动态链接库入口函数

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

每个DLL必须具有一个入口点,就像应用程序一样。当进程和线程加载或卸载DLL时,操作系统调用入口点函数。如果您将DLL与库(例如C运行时库)链接,则可以为您提供入门点函数,并允许您提供单独的初始化函数。检查运行时库的文档以获取更多信息。

如果您提供自己的入口点,请参阅DllEntryPoint功能。名称DllEntryPoint是用户定义函数的占位符。通常,您使用链接器为DLL指定一个入口点。检查您的链接器文档以获取更多信息。

调用入口点函数

任何一个以下事件发生时,操作系统调用入口点函数:

*一个进程加载DLL。对于使用加载时动态链接的进程,DLL在进程初始化期间被加载。对于使用运行时链接的进程,DLL将在LoadLibraryLoadLibraryEx返回之前加载。

*一个进程卸载DLL。当进程终止或调用FreeLibrary函数并且引用计数变为零时,DLL将被卸载。如果进程由于TerminateProcessTerminateThread功能而终止,则系统不会调用DLL入口点函数。

*在加载了DLL的进程中创建了一个新线程。创建线程时,可以使用DisableThreadLibraryCalls功能禁用通知。

*加载DLL的进程的线程正常终止,不使用TerminateThreadTerminateProcess.当一个进程卸载DLL时,对于整个进程,入口点函数只调用一次,而不是每个进程的现有线程一次。线程被终止时,您可以使用DisableThreadLibraryCalls禁用通知。

一次只能有一个线程可以调用入口点函数。

系统在进程或线程的上下文中调用入口点函数,导致调用该函数。这允许DLL使用其入口点功能来在调用进程的虚拟地址空间中分配内存,或打开进程可访问的句柄。入口点函数还可以通过使用对新线程分配私有的内存线程本地存储(TLS)。有关线程本地存储的更多信息,请参阅线程本地存储.

入口点功能定义

必须使用标准调用调用约定来声明DLL入口点函数。

Windows NT:如果DLL入口点未正确声明,则不会加载DLL,并且系统将显示一条消息,指示必须使用WINAPI声明DLL入口点。

Windows 95:如果DLL入口点未正确声明,则DLL未加载,系统会显示一条标题为“错误启动程序”的消息,该消息指示用户检查文件以确定问题。

在函数正文中,您可以处理以下场景的任何组合,其中调用了DLL入口点:

*进程加载DLL(DLL_PROCESS_ATTACH)。

*当前进程创建一个新线程(DLL_THREAD_ATTACH)。

*线程正常退出(DLL_THREAD_DETACH)。

*一个进程卸载DLL(DLL_PROCESS_DETACH)。

以下示例演示如何构造DLL入口点函数。

BOOL WINAPI DllEntryPoint(

HINSTANCE hinstDLL, //处理DLL模块

DWORD fdwReason, //调用函数的原因

LPVOID lpReserved ) //保留

{

//根据调用原因执行操作。

开关(fdwReason)

{

case DLL_PROCESS_ATTACH:

//为每个新进程初始化一次。

//返回FALSE以失败DLL加载。

break;

case DLL_THREAD_ATTACH:

//做线程特定的初始化。

break;

case DLL_THREAD_DETACH:

//进行线程特定的清理。

break;

case DLL_PROCESS_DETACH:

//执行任何必要的清理。

break;

}

return TRUE; //成功的DLL_PROCESS_ATTACH。

}

入口点函数返回值

当一个DLL入口点函数被调用,因为一个进程正在加载,该函数返回TRUE表示成功。对于使用加载时链接的进程,返回值FALSE会导致进程初始化失败,进程终止。对于使用运行时链接的进程,返回值为FALSE会导致LoadLibraryLoadLibraryEx函数返回NULL,表示失败。当由于任何其他原因调用函数时,入口点函数的返回值被忽略。