When the application calls the
LoadLibrary or
LoadLibraryEx functions, the system attempts to locate the DLL (for details, see
Dynamic-Link Library Search Order). If the search succeeds, the system maps the DLL module into the virtual address space of the process and increments the reference count. If the call to
LoadLibrary or
LoadLibraryEx specifies a DLL whose code is already mapped into the virtual address space of the calling process, the function simply returns a handle to the DLL and increments the DLL reference count. Note that two DLLs that have the same base file name and extension but are found in different directories are not considered to be the same DLL.

The system calls the entry-point function in the context of the thread that called
LoadLibrary or
LoadLibraryEx. The entry-point function is not called if the DLL was already loaded by the process through a call to
LoadLibrary or
LoadLibraryEx with no corresponding call to the
FreeLibrary function.

The
GetModuleHandle function returns a handle used in
GetProcAddress,
FreeLibrary, or
FreeLibraryAndExitThread. The
GetModuleHandle function succeeds only if the DLL module is already mapped into the address space of the process by load-time linking or by a previous call to
LoadLibrary or
LoadLibraryEx. Unlike
LoadLibrary or
LoadLibraryEx,
GetModuleHandle does not increment the module reference count. The
GetModuleFileName function retrieves the full path of the module associated with a handle returned by
GetModuleHandle,
LoadLibrary, or
LoadLibraryEx.

When the DLL module is no longer needed, the process can call
FreeLibrary or
FreeLibraryAndExitThread. These functions decrement the module reference count and unmap the DLL code from the virtual address space of the process if the reference count is zero.

Run-time dynamic linking enables the process to continue running even if a DLL is not available. The process can then use an alternate method to accomplish its objective. For example, if a process is unable to locate one DLL, it can try to use another, or it can notify the user of an error. If the user can provide the full path of the missing DLL, the process can use this information to load the DLL even though it is not in the normal search path. This situation contrasts with load-time linking, in which the system simply terminates the process if it cannot find the DLL.