2010-05-27 12 views
6

Farklı bir uygulama için bir eklenti olan bir yerel DLL var (esas olarak sıfır denetimi sahip biri). Her şey, ek bir .lib dosyasıyla bağlantı kurabilmem (sadece benim DLL'ümü ABQSMABasCoreUtils.dll adlı başka bir DLL'ye bağlayana kadar). Bu dosya, kullanmak istediğim ana uygulamadan bazı ek API'ler içeriyor. Dışa aktarılan işlevlerden herhangi birini kullanmak için herhangi bir kod yazmamıştım, ancak sadece bu yeni DLL'ye bağlanırken sorunlara neden oluyor. Spesifik olarak, programı çalıştırmayı denediğimde aşağıdaki hatayı alıyorum:Win32 DLL alma sorunları (DllMain)

Uygulama düzgün bir şekilde başlayamadı (0xc0000025). Uygulamayı sonlandırmak için Tamam'ı tıklayın.

Bunun tipik olarak bunun bir FALSE döndüren bir DllMain işlevi nedeniyle olduğunu bir yere okuduğuma inanıyorum.

HATA: Ayrıca aşağıdaki mesaj standart çıktıya yazılır Bellek ayırma bileşeni başlatma

önce teşebbüs ben bu hata mesajı uygulamadan gelen ve bir tür değildir neredeyse% 100 emin Windows hatası./MAP çıkan .map dosyasında bu açık ve bulunan ile

(aka her bildiğim geçiş etrafında havayı dövüyordu ve saygısız) bu biraz daha içine bakıyor ben bağlantılı:

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 

O undecorate olursa Ben ABQSMABasCoreUtils.dll herhangi bir şey bu .map dosya içinde var olabilir ya da neden benim DLL bile ABQSMABasCoreUtils.dll yüklemeye çalışıyor anlamak emin değilim

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) 

: "undname" aşağıdaki (aynı sırada) vermek kullanarak isimler referenc herhangi bir kod yoksa bu DLL es. Bu bilgiyi bir araya getirmeme ve bunun neden işe yaramadığını öğrenmek isteyen var mı? Bunun ne anlama geldiğine göre, ana uygulama ABQSMABasCoreUtils.dll'u içe aktardığı "dumpbin" ile doğrulandı, ne olursa olsun yükleniyor. Ben de bu DLL benim DLL'de yükleme gecikme denedim ama bu sonuçları değiştirmedi.

DÜZENLEME

Çift kontrol ettikten ve ilgili tüm dosyalar 64 bitlik vardır.

+1

İthalat kitaplığının statik bağlantısı yerine 'LoadLibrary' kullanmayı denediniz mi? Bunu yaparsanız, ana uygulama zaten başlatılmış ve bazı avantajlarınız var. – Oleg

+0

Bunu düşündüm ama bu kütüphaneden büyük miktarda fonksiyon kullanacağım. Her biri için GetProcAddress'i kullanmam gerekmeyecek mi? Mümkünse bundan kaçınmayı tercih ederim. – brady

+1

C0000025 = STATUS_NONCONTINUABLE_EXCEPTION. Uygulamayı windbg'de çalıştırmayı deneyin ve nerede kilitlendiğini görün; belki bu sana bir ipucu verir. – Luke

cevap

5

Tam olarak aynı problemi yaşadım. Bu DLLS yüklemesi yerine Abaqus API ile ilgili bir sorundur.

Bunun nedeni, Abaqus API'sinin yeni ve silme işlevlerini geçersiz kılmasından kaynaklandığının farkındayım (fark ettiğiniz gibi). Yeni arama veya böyle odb_initializeAPI(); arayarak olarak Abaqus API, başlatılıyor önce programa yılında silerseniz

HATA olsun: bileşen başlatma önce teşebbüs Bellek tahsisi

hata mesajı ve program çöker .

Programımda, ilk new numaralı telefondan odb_initializeAPI(); numaralı telefonu arayarak sorunu çözdünüz.

+1

Bunu düzeltmemden beri biraz zaman geçti ama biraz farklı bir sorunum vardı. Aslında bir kullanıcı alt yordamında ODB'ye erişiyordum, bu yüzden getActiveOdb() kullanıyordum. Msvcr90.dll ve Abaqus msvcr80.dll kullanıyordum bir bağımlılık ile derleme çünkü bu hatayı alıyorum. Ancak yukarıdakileri gönderdiğinize sevindim - Abaqus kullanıcı altyordamları ve işlemciler için hızlı bir şekilde çevrimiçi yardım bulmak zor. – brady

+0

@brady Bağımlılık sorununu nasıl tespit edip düzelttiniz? Programımda msvcr100.dll '' msvcr80.dll 'ile çakıştığına inanıyorum. Bununla ilgili biraz yardım isterim. – Derek

+1

Nasıl tanımladığımı hatırlamıyorum - muhtemelen "dumpbin/imports" yardımcı programını kullandım ve gereksiz C++ çalışma zamanı kitaplıklarını fark ettim. Sorunu çözmek için, Abaqus'un bu sürümü için desteklenen C++ derleyicisi olan Visual C++ 8.0 (Visual Studio 2005) ile oluşturmak zorunda kaldım. Desteklenen derleyicileri burada görüntüleyebilirsiniz: [Abaqus Sistem Gereksinimleri] (http://www.3ds.com/support/certified-hardware/simulia-system-information/). Uygun sürümü seçin ve Sistem Gereksinimleri'ni tıklayın, platformunuzu seçin ve C++ Derleyici gereksinimlerini arayın. – brady

0

ABQSMABasCoreUtils.dll, 64 bit işlevleri içe aktarıyor gibi görünüyor. Senin dll de 64-bit mi? Değilse, o zaman sorun budur - aynı işlemde farklı mimariler için derlenmiş DLL'leri birleştiremezsiniz.

+0

Durum buysa, kod derlenemedi - çalışma zamanında başarısız olmaz. –

2

Tabii ki, bu kitaplığın içe aktarmalarına başvurursunuz. Yeni veya silme operatörünü kullanmadan bir C++ programı yazmak zor. Bu işleçlerin CRT versiyonunu geçersiz kılmak için ihtiyaç duyduğunu düşünen 3. parti yazılımlarla uğraşmak yeterince zor, zamanın doğru olduğunu düşünene kadar aramanıza izin vermeyeceği zaman imkansız. Tüm umutları bırakın veya satıcıdan yardım isteyin.

+1

Büyük C++ programlarının bu tür ortak operatörleri geçersiz kılması yaygın mıdır? Bu oldukça aptalca görünüyor./DEFAULTLIB ile bunun üzerinden geçmek mümkün mü? – brady

+2

Yalnızca aptal programlarda ve bunlarla bağlantılı tüm kodlara dayanan temel stil sınıfı kitaplıklarında yaygındır. Etrafından geçemezsin. Bazı kod, kod ayırıcı ve diğer kod kullanmadığında .lib kesmek sadece keder getirecektir. Bu bir otomatik bellek sızıntısı veya AV. –

1

ABQSMABasCoreUtils.dll dosyasının yüklenmesi sırasında bir hatanın olası nedenlerinden biri, bazı bağımlılık modülünün (kapsayıcı gecikmeli yük DLL'leri) bulunamamasıdır. ABQSMABasCoreUtils.dll dosyasının bağımlılığını incelemek için Bağımlılık Walker (bkz. http://www.dependencywalker.com/) öğelerini kullanın.

  1. Eğer LoadLibrary saygıyla ABQSMABasCoreUtils.dll yükleyebilir doğrulayın:

    İki öneri var. ABQSMABasCoreUtils.dll'den herhangi bir işlevi çağırmanıza gerek yoktur. LoadLibrary'un kullanımı Son çözüm olarak göremiyorum. Bu sadece bir teşhis testi. Test ile, programınızda ABQSMABasCoreUtils.dll dosyasını yükleme konusunda genel bir sorun olduğunu veya bir işlem başlatma sorununa sahip olduğunuzu doğrulayabilirsiniz.

  2. ABQSMABasCoreUtils.dll dosyasının LoadLibrary açısından yüklenmesi başarısız olursa, ABQSMABasCoreUtils.dll dosyasının yüklenmesi sırasında yapılan tüm çağrıların protokolüne Bağımlılık Yürütücüsü profilleme özelliğini kullanın. Diğer bir yöntem, ABQSMABasCoreUtils.dll dosyasının yüklenmesi sırasında hangi dosya ve kayıt defteri işlemlerinin gerçekleştirileceğini izlemek için Process Monitor (bkz. http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx) kullanılmasıdır.

LoadLibrary başarısız olursa, gerçekten bir DLL başlatma sorunu var. DllMain içinde bir DLL, henüz başlatılmamış (henüz DllMain döndüren) başka bir DLL'den bir işlev kullanmayı deneyin, genellikle sorun var. Bu sorunun teşhisine başlamadan önce, LoadLibrary ile daha basit bir problemi dışarıda bırakmaya çalışmalıyız.