2011-09-20 4 views
5

LoadLibraryGetProcAddress을 사용하는 DLL에서 함수를 호출하는 Visual Studio 6 (필자는 FML)에서 작성된 응용 프로그램을 작성하고 있습니다. 최신 코드는 VC6에서 컴파일 할 수 없으며 최신 컴파일러가 필요합니다. DLL에는 C++ 개체를 생성하는 몇 가지 함수가 있으며 VC6 프로그램은 추상 클래스를 통해 개체를 사용합니다.MSVC6는 extern "C"함수의 예외를 어떻게 처리 할 수 ​​있습니까?

이것은 정상적으로 잘 작동하지만 GetProcAddress에 의해 검색된 함수가 예외를 throw 할 때 문제가 발생합니다. 예외가 DLL 내에서 발견되는 경우에도 문제가 발생합니다. 이 추상 클래스의 메서드를 예외를 throw 할 때 발생하지 않는 것으로 나타났습니다. 이 경우 정상적으로 작동합니다.

내가 뭘 잘못하고 있니? 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에서 모든 처리기를 catch합니까? 예외를 잡지 않는 핸들러의 예제를 볼 수 있습니까? –

답변

1

당신은 그런 상속 크로스 컴파일러 버전을 수행 할 수 없습니다 여기에 프로그램이 충돌을 일으키는 함수의 예입니다. 그것은 거의 작동하지만 예외와 몇 가지 다른 것들이 미쳐갑니다.

+1

그 이유는 무엇입니까? 나는 당신의 dll이 오래 살아 가려면 C++이 아닌 C로 공용 인터페이스를 제한해야한다고 말한다. – rodrigo

+1

여기의 문제는 인터페이스에 없다. 문제는 DLL_ 내부의 예외가 원인이다. 예외가 잡히기 전에 중단하라. 예외는 DLL 경계를 넘기위한 것이 아니며, DLL 코드 내에서 완전히 던져 져서 잡힐 것입니다. – Brian

+0

문제는 런타임을 혼란스럽게하는 방식으로 ABI 호환성이 깨졌습니다. – Joshua

관련 문제