Проблемы импорта DLL Win32 (DllMain)

у меня есть собственная DLL, которая является плагином для другого приложения (тот, который у меня есть по существу нулевой контроль). Все работает просто отлично, пока я не свяжусь с дополнительным .lib-файл (связывает мою DLL с другой DLL с именем ABQSMABasCoreUtils.dll). Этот файл содержит некоторые дополнительные API из родительского приложения, которое я хотел бы использовать. Я даже не написал код для использования любой из экспортированных функций, но просто связывание в этой новой DLL вызывает проблемы. В частности, я получаю следующее ошибка при попытке запустить программу:

приложение не удалось правильно инициализировать (0xc0000025). Нажмите на OK, чтобы завершить работу приложения.

Я думаю, что где-то читал, что это обычно связано с функцией DllMain, возвращающей FALSE. Кроме того, на стандартный вывод записывается следующее сообщение:

ошибка: попытка выделения памяти перед инициализацией компонента

я почти на 100% уверен в этом сообщение об ошибке приходит из приложения и не является каким-либо типом ошибки Windows.

глядя на это немного больше (ака размахивая и переворачивая каждый переключатель, который я знаю), я связался с /MAP включен и нашел это в результате .файл карты:

 0001:000af220       ??3@YAXPEAX@Z              00000001800b0220 f   ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll
 0001:000af226       ??2@YAPEAX_K@Z             00000001800b0226 f   ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll
 0001:000af22c       ??_U@YAPEAX_K@Z            00000001800b022c f   ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll
 0001:000af232       ??_V@YAXPEAX@Z             00000001800b0232 f   ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll

если я отменяю эти имена, используя "undname", они дают следующее (тот же порядок):

void __cdecl operator delete(void * __ptr64)
void * __ptr64 __cdecl operator new(unsigned __int64)
void * __ptr64 __cdecl operator new[](unsigned __int64)
void __cdecl operator delete[](void * __ptr64)

Я не уверен, что понимаю, как что-нибудь из ABQSMABasCoreUtils.dll может существовать в этом .файл карты или почему моя DLL даже пытается загрузить ABQSMABasCoreUtils.DLL, если у меня нет кода, который ссылается на эту DLL. Может кто-нибудь помочь мне собрать эту информацию и выяснить, почему это не работает? Для чего это стоит, я подтвердил через "dumpbin", что родительское приложение импортирует ABQSMABasCoreUtils.dll, поэтому он загружается независимо от того, что. Я также попытался задержать загрузку этой DLL в моей DLL, но это не изменило результаты.

редактировать

Я дважды проверил и все файлов 64-разрядной.

4 ответов


у меня была точно такая же проблема. Это проблема с API Abaqus, а не с загрузкой DLL.

Я думаю, это потому, что API Abaqus переопределяет новые и удаляют функции (как вы, кажется, заметили). Если вы вызываете new или delete в своей программе до инициализация API Abaqus, например, путем вызова odb_initializeAPI(); тогда

ошибка: попытка выделения памяти перед компонентом инициализация

сообщение об ошибке и программа завершает работу.

В моей программе, назвав odb_initializeAPI(); до первого new проблема решена.


ну, конечно, вы будете ссылаться на импорт этой библиотеки. Трудно написать программу на C++ без использования оператора new или delete. Работа с программным обеспечением 3rd, которое считает, что ему нужно переопределить версию CRT этих операторов, достаточно сложна, невозможна, когда она не позволит вам позвонить им, пока не сочтет, что пришло время. Оставь всякую надежду или обратись за помощью к продавцу.


одна из возможных причин ошибки при загрузке ABQSMABasCoreUtils.dll - это то, что не удалось найти некоторый модуль зависимостей (включая DLL с задержкой загрузки). Использовать Зависимость Walker (см. http://www.dependencywalker.com/) для изучения всех зависимостей ABQSMABasCoreUtils.файл DLL.

у меня есть два предложения:

  1. убедитесь, что вы можете загрузить ABQSMABasCoreUtils.dll с уважением LoadLibrary. Вам не нужно вызывать какую-либо функцию из ABQSMABasCoreUtils.файл DLL. Использование LoadLibrary Я не вижу в качестве конечного решения. Это всего лишь диагностический тест. С помощью теста вы можете проверить, есть ли у вас общая проблема загрузки ABQSMABasCoreUtils.dll в вашей программе или у вас есть какая-то проблема инициализации процесса.
  2. если загрузка ABQSMABasCoreUtils.dll с уважением LoadLibrary произойдет сбой, затем используйте функцию профилирования зависимостей Walker для протокола всех вызовов, выполняемых во время загрузки ABQSMABasCoreUtils.файл DLL. Другим способом было бы использование Process Monitor (см.http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) чтобы проследить, какие операции с файлами и реестром будут выполняться во время загрузки ABQSMABasCoreUtils.файл DLL.

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


В ABQSMABasCoreUtils.dll выглядит так, как будто импортирует 64-разрядные функции. Ваша dll также 64-разрядная? Если нет, то это проблема - вы не можете смешивать DLL, скомпилированные для разных архитектур в одном процессе.