我正在用Visual Studio 6(我知道,FML)使用LoadLibrary
和GetProcAddress
調用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;
}
}
所有模塊是否使用msvc運行時的相同實例? –
他們不是,這就是問題所在。 –
@Brian你有沒有發現DLL中的所有處理程序?我們可以看到一個這樣的處理程序沒有發現異常的例子。 –