Переименование DLL приводит к сбою кода, использующего ее - PullRequest
1 голос
/ 09 декабря 2010

У меня есть DLL, которая написана на родном C ++. Имя проекта Visual Studio - MyDll, и оно компилируется в файл с именем MyDll.dll в выходном каталоге.

После компиляции я переименую его в MyDll2.dll. (Этот пример кажется глупым, но у меня есть веская причина переименовать его.)

Второй проект, написанный на C ++ / CLI, использует эту DLL.

Во время компиляции этот проект ссылается на MyDll.lib (генерируется при компиляции MyDll), чтобы иметь возможность использовать классы, определенные в dll.

Во время выполнения, чтобы загрузить DLL, я вызываю LoadLibrary, передавая полный путь к файлу C:\...\MyDll2.dll (на самом деле он находится в той же папке). Он успешно загружается, как показывает возвращаемое значение LoadLibrary.

При первом появлении кода, в котором я использую класс, определенный в DLL (просто объявляющий объект в стеке), происходит сбой с SEHException (эти исключения не дают никакой информации о причине сбоя .. .)

Это происходит только тогда, когда я делаю шаг переименования. Если я оставлю это как MyDll.dll и вызову LoadLibrary для этого файла, все работает нормально. Так что, очевидно, из-за переименования.

Есть идеи, почему? Мне не разрешено переименовывать DLL?

(РЕДАКТИРОВАТЬ: уточнение путем предоставления более подробной информации)

Ответы [ 5 ]

2 голосов
/ 09 декабря 2010

При сборке dll компоновщик также генерирует lib-файл, который вы используете для ссылки в вашем исполняемом файле.Этот файл lib содержит имя dll, из которого импортируются экспортируемые функции и данные.Таким образом, ваш исполняемый файл содержит ссылки на исходное имя dll.

1 голос
/ 10 декабря 2010

Я согласен с Эдвином. Файл lib указывает на экспортируемые функции, а также содержит имя dll, которое было во время компиляции.

1 голос
/ 09 декабря 2010

, в этом случае мне придется перекомпилировать, чтобы изменить имя файла

Да, вы должны изменить аргумент LoadLibrary () при переименовании DLL.Исправьте вашу реальную проблему, похоже, что вы вообще не проверяете возвращаемое значение LoadLibrary ().Бросьте Win32Exception, когда он возвращает NULL.

1 голос
/ 09 декабря 2010

Почему вы переименовываете DLL после ее загрузки? Вы никогда не должны переименовывать DLL после того, как вы вызвали LoadLibrary. Я удивлен, что ОС даже позволит вам сделать это.

0 голосов
/ 14 января 2012

Я не знаю, будет ли кто-нибудь читать это через год, но почему OP даже LoadLibrary 'переименовал в dll, когда он уже был статически связан? Это 2 разные вещи. Я думаю, что приложение OP зависало из-за отсутствия MyLib.dll, необходимого после статического связывания, и LoadLibrary не имеет к этому никакого отношения, OP также может опустить LoadLibrary MyLib2.dll, и результат будет точно таким же. Единственное, что я не могу объяснить, это неизвестная ошибка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...