|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Run-Time Dynamic Linking
When the application calls the LoadLibrary or LoadLibraryEx functions, the system attempts to locate the DLL using the same search sequence used in load-time dynamic linking (see Load-Time Dynamic Linking). 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 filename and extension but are found in different directories are not considered to be the same DLL.
The operating 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. If the system cannot find the DLL or if the entry-point function returns FALSE, LoadLibrary or LoadLibraryEx returns NULL. If LoadLibrary or LoadLibraryEx succeeds, it returns a handle of the DLL module. The process can use this handle to identify the DLL in a call to the GetProcAddress, FreeLibrary, or FreeLibraryAndExitThread 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.
The process can use GetProcAddress to get the address of an exported function in the DLL using a DLL module handle returned by either LoadLibrary, LoadLibraryEx, or GetModuleHandle. 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 operating system simply terminates the process if it cannot find the DLL.
Run-time dynamic linking can cause problems if the DLL uses the DllEntryPoint function to perform initialization for each thread of a process, because the entry-point is not called for threads that existed before LoadLibrary or LoadLibraryEx is called. For an example showing how to deal with this problem, see Using Thread Local Storage in a Dynamic-Link Library.
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
ДИНАМИЧЕСКАЯ Связь Run-Time
Когда приложение называет LoadLibrary или функции LoadLibraryEx, системные попытки, чтобы располагать DLL, использовавшее ту же последовательность поиска использованную в нагрузке-времени динамической связи (смотри Динамическую Связь Load-Time). Если поиск добивается успеха, система отображает модуль DLL в виртуальное пространство адреса процесса и увеличивает счет ссылки. Если вызов на LoadLibrary или LoadLibraryEx определяет DLL чьего кода уже отображен в виртуальное пространство адреса вызова процесса, функция просто возвращает ручку на DLL и увеличивает счет ссылки DLL. Отметьте, что два DLLs, что иметь ту же базу filename и расширение но обнаружены в других директориях не считаться тот же DLL.
Операционная система называет вход-точку функции в контексте резьбы, что назвавшее LoadLibrary или LoadLibraryEx. Вход-точка функции не назван если DLL уже был загружен процессом через вызов на LoadLibrary или LoadLibraryEx без соответствующего вызова в функцию FreeLibrary. Если система не может найти DLL или если вход-точка функции возвращает ЛОЖЬ, LoadLibrary или возврат LoadLibraryEx НЕДЕЙСТВИТЕЛЬНЫЙ. Если LoadLibrary или LoadLibraryEx добивается успеха, это возвращает ручку модуля DLL. Процесс может использовать эту ручку, чтобы идентифицировать DLL на вызове в GetProcAddress, FreeLibrary, или функцию FreeLibraryAndExitThread.
Функция GetModuleHandle возвращает ручку использованную в GetProcAddress, FreeLibrary, или FreeLibraryAndExitThread. Функция GetModuleHandle добивается успеха только если модуль DLL уже отображен в пространство адреса процесса связью нагрузки-время или предшествующим вызовом на LoadLibrary или LoadLibraryEx. В отличие от LoadLibrary или LoadLibraryEx, GetModuleHandle не увеличивает модульный счет ссылки. Функция GetModuleFileName извлекает полный путь модуля связанного ручкой возвращанной GetModuleHandle, LoadLibrary, или LoadLibraryEx.
Процесс может использовать GetProcAddress, чтобы получать адрес экспортируемой функции в DLL, использовавший модульную ручку DLL возвращался также LoadLibrary, LoadLibraryEx, или GetModuleHandle. Когда модуль DLL не - больше не нужно, процесс может назвать FreeLibrary или FreeLibraryAndExitThread. Этот декремент функций модульная ссылка считает и unmap код DLL из виртуального пространства адреса процесса если счет ссылки нулевой.
Время прогона динамической связи позволяет процесс, чтобы продолжать работать даже если бы DLL не доступен. Процесс может затем использовать альтернативный метод, чтобы выполнять свою цель. Например, если процесс - не в состоянии расположить один DLL, он может пытаться использовать другое, или это может уведомить потребитель об ошибке. Если пользователь может обеспечить полный путь потери DLL, процесс может использовать эту информацию, чтобы загружать DLL даже если он - не в нормальном пути поиска. Эта ситуация контрастирует со связью загрузки-время, в которой операционная система просто завершает процесс если она не может найти DLL.
Время прогона динамической связи может вызвать проблемы если DLL использует функцию DllEntryPoint, чтобы выполнять инициализацию для каждой резьбы процесса, поскольку вход-точка не назван к резьбе, что просуществованное прежде, чем LoadLibrary или LoadLibraryEx будет назван. Для примера, показывающего как, чтобы иметься дело с этой проблемой, смотри Использование Резьбы Локальной Памяти в Библиотеке Dynamic-Link.
|
|
|
|
| |