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;
}
}
Tüm modüller, msvc çalışma zamanının aynı örneğini kullanıyor mu? –
Onlar değil ve bu sorun. –
@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? –