JMMS Karunarathne Ответов: 3

С родной++ DLL с помощью функции LoadLibrary ВСТО не работает


Я разработал VSTO Adding to Word с VS2010 C#, и у него есть собственная DLL, разработанная с Embercardeo c++ 10, проблема в том, что моя библиотека DLL C++ загружает другую собственную библиотеку DLL через LoadLibrary("lib2.dll") эта команда не работает, но когда я использую абсолютный путь в качестве LoadLibrary("E:\\DMSUSER\\bin\\Debug\\lib2.dll") он загружается и работает правильно.

Примечание: все библиотеки DLL находятся в одном каталоге, и LoadLibrary("lib2.dll") успешно работает в режиме VS debug running. мои коды следующие.

Что я уже пробовал:

//not loading code
HINSTANCE DllInst = NULL;
if (DllInst == NULL) DllInst = LoadLibrary("lib2.dll");
if (DllInst)
{//my code}




//рабочий код с абсолютным путем к файлу
HINSTANCE DllInst = NULL;
if (DllInst == NULL) DllInst = LoadLibrary("E:\\DMSUSER\\bin\\Debug\\lib2.dll");
if (DllInst)
{//my code}

11917640 Member

https://docs.microsoft.com/en-us/windows/desktop/Dlls/dynamic-link-library-search-order порядок поиска библиотеки динамических ссылок см. В разделе стандартный порядок поиска для настольных приложений.
1. каталог, из которого загружается приложение (каталог exe). 2. Системный каталог. 3. Каталог окон. 4. Текущий каталог. 5. Путь

11917640 Member

Если он работает под отладчиком, то разница, вероятно, находится в текущем каталоге.

JMMS Karunarathne

все библиотеки DLL находятся в одном каталоге, если я развертываю с абсолютным путем-это работает, проблема заключается в том, что какой-то пользователь устанавливает в пользовательский каталог dll, который не загружается.

Rick York

Его первое замечание очень важно и является ключом к вашей проблеме. У вас есть три варианта : 1. требуйте, чтобы библиотеки DLL находились в одном из 5 мест, перечисленных выше; 2. попросите пользователя сообщить вам, где они находятся, с помощью опции конфигурации, если они не находятся в одном из этих мест; 3. Найдите диск(Ы) и найдите их самостоятельно. Других вариантов нет в наличии.

3 Ответов

Рейтинг:
2

Mike Diack

Есть несколько вещей, чтобы проверить здесь...

1) все библиотеки DLL имеют одинаковую разрядность (32 или 64 бит - но вы не можете их смешивать).
2) Какие зависимости они имеют? С какими библиотеками DLL среды выполнения C++ / C они связаны? Установлены ли они.
3) Попробуйте запустить свою программу, контролируемую монитором процессов Sysinternals. Посмотрите, что он пытается сделать, когда пытается загрузить библиотеки DLL.
4) Проверьте GetLastError при попытке загрузить DLL.
5) PS какую ОС (и какую битность) вы используете?

Удачи

Майк


JMMS Karunarathne

спасибо майку за ваш комментарий, все dll являются 32-битными и не имеют никаких зависимостей для библиотек DLL c++. операционная система-windows 7 32bit. я попробую ваши 3 и 4 и прокомментирую результат.

Рейтинг:
1

KarstenK

Вы должны узнать о выполнении программы. Это сложное поле, поэтому вы можете начать с самого начала. Документация Microsoft.

Каждый процесс выполняется в некотором каталоге, и это может быть не каталог модуля. Посмотрите в настройках проекта, где он находится, потому что отладчик управляет этим с помощью некоторых настроек.

Важно: в полном решении ваш exe-файл использует полный путь для загрузки dll, так что вы приложение безопасно от атак инъекции dll!!!


JMMS Karunarathne

все dll-это один и тот же каталог, обратите внимание, если я использую полный путь dll, он работает, проблема заключается в том, что любой пользователь устанавливает в пользовательский каталог dll, который не загружается, и система терпит неудачу.

Рейтинг:
1

JMMS Karunarathne

Спасибо вам всем за все ваши комментарии, я все понял и решил. спасибо за все.