Отключить автоматическую загрузку DLL в C ++ - PullRequest
2 голосов
/ 03 октября 2009

Мой сценарий таков: мое приложение зависит от определенной DLL (я использую ее lib во время компоновки). Однако, когда мое приложение выполняется, я хочу явно загрузить эту DLL с помощью LoadLibrary. Однако по умолчанию, когда код достигает области, где требуется эта DLL, среда автоматически ищет ее, а затем загружает. Я хочу отключить это поведение, и мне все равно, если приложение достигло точки, когда оно хочет выполнить код, принадлежащий этой DLL, я предпочитаю, чтобы оно зависало, а не загружалось автоматически (поэтому загружается только DLL потому что я явно назвал LoadLibrary).
В то же время я использую возможность отложенной загрузки (поэтому запуск загрузки будет происходить только тогда, когда DLL действительно должна быть загружена). Однако я бы предпочел, чтобы приложение просто зависало, если DLL еще не загружена.

Может, кто-нибудь знает способ достижения этого?

Ответы [ 6 ]

6 голосов
/ 03 октября 2009

Если вы хотите использовать LoadLibrary, не связывайте приложение с библиотекой импорта. Формат PE не поддерживает неразрешенные внешние элементы, поэтому вы используете либо заголовки и dllimport, либо LoadLibrary, GetProcAddress и указатели на функции.

4 голосов
/ 03 октября 2009

(я использую lib при подключении)

Если вы хотите загрузить его вручную, используя LoadLibrary и GetProcAddress, вам не следует передавать файл *.lib вашему компоновщику.

2 голосов
/ 03 октября 2009

Вы можете предотвратить автоматическую загрузку, не связываясь с библиотекой импорта DLL (файл .lib). Затем вы можете использовать LoadLibrary для ручной загрузки DLL, когда вам это нужно.

Я разместил запись в блоге о таких вещах здесь .

1 голос
/ 05 октября 2009

Вы можете подключить механизм задержки загрузки.Установите __pfnDliNotifyHook2 для функции, которую вы предоставляете, и в этом хуке просто завершите ваше приложение.

0 голосов
/ 03 октября 2009

Это то, что вам нужно: http://msdn.microsoft.com/en-us/library/151kt790(VS.80).aspx?

Я имею в виду, что вы можете предоставить свою собственную функцию для загрузки DLL и оттуда вывести свою заявку Это подробно описано в приведенной ссылке.

0 голосов
/ 03 октября 2009

Функция delayload не будет загружать dll до первого вызова функции, а не области видимости. Если у вас есть глобальные инициализаторы, которые обращаются к этой dll, то, возможно, именно поэтому вы думаете, что это основано на объеме. Моя компания использует технику вызова LoadLibrary перед использованием без проблем. Я предлагаю углубиться в вашу проблему.

...