2011-09-20 68 views
5

我正在用Visual Studio 6(我知道,FML)使用LoadLibraryGetProcAddress調用DLL中的函數編寫的應用程序。較新的代碼無法在VC6中編譯,並需要更新的編譯器。該DLL有一些構建C++對象的函數,然後VC6程序通過抽象類使用該對象。MSVC6如何處理來自外部「C」函數的異常?

這種情況通常很好,但當GetProcAddress檢索到的函數發生異常時(即使在DLL中捕獲到異常時),它會遇到問題。我注意到當抽象類的方法拋出異常時,這種情況不會發生。在這種情況下,事情正常運作。

我在這裏做錯了什麼?我怎樣才能讓VC6生成代碼來正確處理異常?

編輯:下面是導致程序崩潰的函數的例子:

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

所有模塊是否使用msvc運行時的相同實例? –

+2

他們不是,這就是問題所在。 –

+0

@Brian你有沒有發現DLL中的所有處理程序?我們可以看到一個這樣的處理程序沒有發現異常的例子。 –

回答

1

你不能這樣做繼承交叉編譯的版本那樣。它幾乎可行,但例外和其他一些事情變得瘋狂。

+1

,這就是爲什麼我總是說,如果你的dll要長壽,你應該將公共接口限制爲C,而不是C++。 – rodrigo

+1

這裏的問題不在接口中,問題在於DLL_的內部異常是因爲在發現異常之前中止程序中止。異常並不意味着跨越DLL邊界,它們將被拋出並被完全捕獲在DLL代碼中。 – Brian

+0

問題在於ABI兼容性以一種混淆運行時的方式被打破。 – Joshua