Mam natywną bibliotekę DLL, która jest wtyczką do innej aplikacji (takiej, z której mam praktycznie zerową kontrolę). Wszystko działa doskonale, dopóki nie połączę się z dodatkowym plikiem .lib (łączy moją bibliotekę DLL z inną biblioteką DLL o nazwie ABQSMABasCoreUtils.dll
). Ten plik zawiera dodatkowe API z aplikacji nadrzędnej, którą chciałbym wykorzystać. Nie napisałem nawet żadnego kodu, aby użyć żadnej z wyeksportowanych funkcji, ale właśnie tworzenie linków w tej nowej bibliotece DLL powoduje problemy. W szczególności pojawia się następujący błąd podczas próby uruchomienia programu:Problemy z importowaniem DLLów Win32 (DllMain)
Aplikacja nie została poprawnie zainicjowana (0xc0000025). Naciśnij "OK" aby zamknąć aplikację.
Wierzę, że przeczytałem gdzieś, że jest to zwykle spowodowane funkcją DllMain zwracającą FALSE. Ponadto, po napisaniu wiadomości do standardowego wyjścia:
BŁĄD: alokacja pamięci próbę przed inicjalizacji komponentu
Jestem prawie 100% pewien, że ten komunikat o błędzie jest pochodzących z aplikacji i nie jest to jakiś rodzaj Błąd systemu Windows.
Patrząc na to trochę więcej (aka wymachując wokół i przerzucanie każdy przełącznik wiem) I połączone z/MAP włączona i znalazłem to w wynikowym pliku .map:
0001:000af220 [email protected]@Z 00000001800b0220 f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll
0001:000af226 [email protected][email protected] 00000001800b0226 f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll
0001:000af22c [email protected][email protected] 00000001800b022c f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll
0001:000af232 [email protected]@Z 00000001800b0232 f ABQSMABasCoreUtils_import:ABQSMABasCoreUtils.dll
Gdybym undecorate tych nazwy używając „undname” dają następujące (sam kolejności):
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)
nie jestem pewien, czy rozumiem, jak coś z ABQSMABasCoreUtils.dll
może istnieć w tym pliku .map lub dlaczego mój DLL nawet próby załadowania ABQSMABasCoreUtils.dll jeśli nie mam żadnego kodu, który odwołuje się es tej biblioteki DLL. Czy ktoś może mi pomóc ułożyć te informacje razem i dowiedzieć się, dlaczego to nie działa? Za to, co jest warte, potwierdziłem przez "dumpbin", że aplikacja nadrzędna importuje ABQSMABasCoreUtils.dll
, więc jest ładowana bez względu na wszystko. Próbowałem również opóźnienia ładowania tego DLL w mojej DLL, ale to nie zmieniło wyników.
EDIT
I dwukrotnie sprawdzane i wszystkie pliki związane są 64-bitowe.
Czy próbowałeś użyć 'LoadLibrary' zamiast statycznego łączenia biblioteki importu? Jeśli to zrobisz, główna aplikacja zostanie już zainicjalizowana i masz pewną przewagę. – Oleg
Pomyślałem o tym, ale w końcu wykorzystam dużą liczbę funkcji z tej biblioteki. Czy nie będę musiał używać GetProcAddress dla każdego z nich? Wolałbym tego uniknąć, jeśli to możliwe. – brady
C0000025 = STATUS_NONCONTINUABLE_EXCEPTION. Spróbuj uruchomić aplikację w trybie windbg i zobacz, gdzie się zawiesza; może to da ci wskazówkę. – Luke