У меня есть собственная 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-битные.
LoadLibrary
вместо статической привязки библиотеки импорта? Если вы сделаете это, ваше основное приложение уже инициализировано, и у вас будет некоторое преимущество. - person Oleg   schedule 28.05.2010