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

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

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

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

ОШИБКА: Выделение памяти предпринято перед инициализацией компонента

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

При изучении этого немного больше (иначе крутящийся вокруг и зеркально отражающий каждый переключатель я знаю о) я связался с / включенным MAP и нашел это в получающемся .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 может существовать в этом .map файле или почему мой DLL даже пытается загрузить ABQSMABasCoreUtils.dll, если у меня нет кода, это ссылается на этот DLL. Кто-либо может помочь мне соединить эту информацию и узнать, почему это не работает? Если это имеет значение я подтвердил через "dumpbin", что родительское приложение импортирует ABQSMABasCoreUtils.dll, таким образом, это загружается несмотря ни на что. Я также попробовал задержку, загружающую этот DLL в моем DLL, но это не изменило результаты.

Править

Я проверил дважды, и все включенные файлы составляют 64 бита.

6
задан brady 2 February 2017 в 21:34
поделиться

3 ответа

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

0
ответ дан 16 December 2019 в 21:35
поделиться

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

2
ответ дан 16 December 2019 в 21:35
поделиться

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

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

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

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

1
ответ дан 16 December 2019 в 21:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: