Coder969 Ответов: 2

Как проверить, что функция dllmain возвращает false


Есть ли способ найти при загрузке cpp dll из exe, является ли эта dll перенастройкой false из метода DllMain

Предположим ,у меня есть cpp exe и внутренне он пытается загрузить cpp dll, а затем, если cpp dll возвращает false из метода DllMain

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

Я проверил в интернете но безуспешно

2 Ответов

Рейтинг:
2

KarstenK

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

Я бы рекомендовал использовать этот инструмент ходок зависимости Этот замечательный инструмент помог мне во многих сумасшедших сценариях и разрешил мои головные боли. Обратите внимание на x32 и x64 вкус этих инструментов (и ваши библиотеки DLL)

profi-tip: используйте статическое связывание как можно чаще и убедитесь, что библиотеки DLL находятся в пути поиска или в правильном каталоге, который также должен быть стартовым каталогом процесса.

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


Рейтинг:
0

Richard MacCutchan

Вы проверили очевидное место? Точка входа DllMain - приложения Windows | Microsoft Docs[^].


Coder969

Спасибо за ответ. Я проверил связь .Я периодически сталкиваюсь с сбоем приложения с ERROR_DLL_INIT_FAILED . У меня есть проект c#, который загружает управляемую cpp dll. управляемая Cpp dll будет загружать стороннюю собственную cpp dll (не используя функцию загрузки библиотеки для загрузки собственной cpp dll , используя заголовочный файл и файл lib). При создании объекта для управляемой библиотеки DLL cpp приложение C# выбрасывает исключение с кодом ошибки 1114. Исходя из ошибки, могу ли я предположить, что собственная функция dll dllmain возвращает false?

Richard MacCutchan

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

Coder969

Я занимаюсь отладкой и тем временем опубликовал вопрос, чтобы получить некоторые подсказки :)

Richard MacCutchan

Без дополнительной информации невозможно предложить что-либо еще.

Coder969

Извините, что не опубликовал исходную ошибку. Я подумал, что это может быть проблема с функцией dllMain в одной из моих dll-библиотек.

Мое приложение периодически выходит из строя . Я сделал отладку через windbg, и она показывает ошибку в clr .Ниже приведен журнал регистрации от windbg

FAULTING_IP:
clr!GetMetaDataInternalInterfaceFrompublic+25e75
6e7256fa f70000000080 тест dword ptr [eax],80000000h

EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffffff)
ExceptionAddress: 6e7256fa (clr!GetMetaDataInternalInterfaceFrompublic+0x00025e75)
Код исключения: c0000005 (нарушение доступа)
ExceptionFlags: 00000000
Количество параметров: 2
Параметр[0]: 00000000
Параметр[1]: 6bd15370
Попытка чтения с адреса 6bd15370

FAULTING_THREAD: 00000c8c

DEFAULT_BUCKET_ID: INVALID_POINTER_READ

Имя процесса: application.exe

ERROR_CODE: (NTSTATUS) 0xc0000005 - инструкция в 0x%08lx ссылается на память в 0x%08lx. Память не может быть %s.

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - инструкция в 0x%08lx ссылается на память в 0x%08lx. Память не может быть %s.

EXCEPTION_PARAMETER1: 00000000

EXCEPTION_PARAMETER2: 6bd15370

READ_ADDRESS: 6bd15370

FOLLOWUP_IP:
clr!GetMetaDataInternalInterfaceFrompublic+25e75
6e7256fa f70000000080 тест dword ptr [eax],80000000h

MOD_LIST: <анализ>

NTGLOBALFLAG: 70

APPLICATION_VERIFIER_FLAGS: 0

MANAGED_STACK:
Функция SP IP
00000000 00000001 App_config_1a0000!Приложение.Прочитать()+0х2
002EF438 0040174B App_config_1a0000!Application.Re()+0xc3
002EF460 00400081 App_config!Приложение.Main()+0x31

StackTraceString: <none>
Значение HRESULT: 8007045a

EXCEPTION_OBJECT: !pe 18f41f8
Объект исключения: 018f41f8
Тип исключения: System.IO.FileLoadException
Сообщение: не удалось загрузить файл или сборку 'ManagedCPP.dll-или одна из его зависимостей. Не удалось выполнить процедуру инициализации библиотеки динамических ссылок (DLL). (Исключение из HRESULT: 0x8007045A)
InnerException: <none>
Трассировка стека (автоматически):
Функция SP IP
00000000 00000001 App_config_1a0000!Приложение.Прочитать()+0х2
002EF438 0040174B App_config_1a0000!Application.Re()+0xc3
002EF460 00400081 App_config!Приложение.Main()+0x31

Из журнала windbg я увидел нарушение доступа из clr, и после этого он показывает проблемы с загрузкой dll. Это потому, что clr crash dll не загружается?

Richard MacCutchan

Message: Could not load file or assembly 'ManagedCPP.dll' or one of its dependencies. A dynamic link library (DLL) initialization routine failed. (Exception from HRESULT: 0x8007045A)

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

Coder969

Библиотека dll помещается в ту же папку . Как компилировать в 32-битные приложения.

Я периодически сталкиваюсь с этой проблемой

Richard MacCutchan

Извините, но здесь действительно больше никто ничего не может сделать. Вам нужно найти какой-то способ захватить больше деталей, когда проблема действительно происходит.

Coder969

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