Обертывание DLL — Понимание, почему импорт не удается

Фон

У меня есть встроенная система, которая запускает приложение, изначально написанное на C ++ и скомпилированное в Visual Studio, в результате чего получается один исполняемый файл и более 30 библиотек DLL. Эти библиотеки нельзя просматривать в VS Object Browser или других инструментах, таких как P / Invoke Interop Assistant.

Загрузка некоторых библиотек DLL в Dependency Walker показывает, что всем им не хватает некоторых зависимостей глубоко в их дереве зависимостей (cdfview.dll, dwmapi.dll, w32topl.dll, …) но согласно этот вопрос, это, вероятно, не проблема.

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

Я пытаюсь вызвать некоторые библиотечные функции и в конце концов создать оболочку, используя C #, но не могу успешно импортировать и вызывать даже самые простые функции. Я всегда получаю следующую ошибку:

Невозможно загрузить DLL ‘dllName.dll’: библиотека динамических ссылок (DLL)
Не удалось выполнить процедуру инициализации. (Исключение из HRESULT: 0x8007045A)

Пример кода [отредактировано]

Из заголовочного файла исходного кода C ++ у меня есть следующие объявления:

#define OB_API __declspec(dllexport) __cdecl

typedef unsigned long DWORD;  // From windef.h
typedef DWORD OBSTATUS;

OBSTATUS OB_API TestObj(void);

В файле исходного кода C ++ дается следующее определение (которое, кажется, всегда возвращает правда):

BOOL WINAPI DllMain(HANDLE  /* hModule */,
DWORD   ul_reason_for_call,
LPVOID  /* lpReserved */
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_PROCESS_DETACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}

В моем классе приложения C # я добавляю следующее объявление:

[DllImport(@"dllName.dll", CallingConvention=CallingConvention.Cdecl)
public static extern ulong TestObj();

Двоичные файлы приложений DLL и C # находятся в одном каталоге.

Вопросы

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

Есть ли способ получить более подробную информацию о том, почему процедура инициализации не удалась?

(Примечание: целевая система работает под управлением .NET Framework 2.0)

1

Решение

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

Проблема в том, что функция вернула FALSE, чтобы указать, что она не может правильно инициализировать DLL. Это, конечно, не дает полную информацию о Зачем он вернул ЛОЖЬ. Windows ничего не может сделать, кроме как сгенерировать ошибку 1114, ERROR_DLL_INIT_FAILED. Если сама DLL не выводит никакой диагностики, вы ничего не можете сделать, кроме как отладить код. Начните с Project + Properties, вкладка Debug, отметьте опцию «Включить отладку неуправляемого кода».

Скрестив пальцы, вы видите сообщение в окне вывода. Шансы не очень хорошие. Если у вас нет исходного кода для DLL, то вам понадобится помощь поставщика или автора DLL. Дайте ему копию тестового проекта, который терпит неудачу, как это.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector