2011-09-20 17 views
5

LoadLibrary ve GetProcAddress kullanarak bir DLL işlevlerini çağıran Visual Studio 6 (Ben, biliyorum, FML) ile yazılmış bir uygulama üzerinde çalışıyorum. Yeni kod, VC6'da derlenemiyor ve daha yeni bir derleyiciye ihtiyaç duyuyor. DLL, bir C++ nesnesi oluşturan birkaç işlevi vardır ve sonra VC6 programı, nesneyi soyut bir sınıfta kullanır.MSVC6, extern "C" işlevlerinin istisnalarını nasıl ele alabilir?

Bu genellikle iyi çalışır, ancak istisnalar DLL içinde yakalanmış olsa bile, GetProcAddress tarafından yapılan işlevler istisnalar attığında sorunlara dönüşür. Soyut sınıfın yöntemleri bir istisna attığında bunun gerçekleşmediğini fark ettim. Bu durumda işler normal çalışır.

Burada yanlış olan ne yapıyorum? VC6'yı istisnaları doğru şekilde ele almak için nasıl kod üretebilirim?

Düzenleme:

extern "C" __declspec(dllexport) Box* getBox(const char* addr) 
{ 
    try { 
     return createBox(addr); 
    } catch (std::exception& ex) { 
     LOG_ERROR("Open failed: " << ex.what()); 
     return 0; 
    } catch (...) { 
     LOG_ERROR("Error while opening."); 
     return 0; 
    } 
} 
+2

Tüm modüller, msvc çalışma zamanının aynı örneğini kullanıyor mu? –

+2

Onlar değil ve bu sorun. –

+0

@Brian DLL'deki tüm işleyicileri yakaladınız mı? Bir istisnayı yakalamayan böyle bir işleyicinin bir örneğini görebilir miyiz? –

cevap

1

Böyle miras çapraz derleyici sürümleri yapamaz: Burada programın çökmesine neden olan bir fonksiyonun örneği verilmiştir. Neredeyse işe yarıyor ama istisnalar ve diğer birkaç şey deliriyor.

+1

Ben her zaman dll uzun yaşamak için gidiyoruz, C++ değil, genel arabirimi sınırlamak gerektiğini söyler. – rodrigo

+1

Burada sorun, arabirimde değil. Sorun, DLL_ _internal istisnalar caus olduğunu caus istisnalar hariç olmak üzere programı iptal etmek için yakalanır. İstisnalar DLL sınırını aşmak anlamına gelmez, atılmak ve tamamen DLL kodu içinde yakalanmak zorundadırlar. – Brian

+0

Sorun, ABI uyumluluğunun çalışma zamanını karıştırıcı bir şekilde kırılmış olmasıdır. – Joshua

İlgili konular