2010-08-22 2 views
1

최근에 직면했던 문제를 재현 할 수있는 기본 솔루션 파일 (.sln)이 있습니다.DLL에 내장되었을 때 _matherr이 호출되지 않습니다.

여기에는 3 개의 프로젝트가 포함되어 있습니다. 1.) MathTest.lib - acos (1.1)와 같이 수학적 오류가 발생할 수있는 메서드가 포함되어 있습니다. 2.) MathTestDll.dll - 위의 lib에서 메서드를 호출합니다. 3.) UnitTest.exe - 오류가 발생할 DLL에서 내 보낸 메서드를 호출합니다.

내가하려는 일은 상당히 간단합니다. 다음 코드는 _matherr() 루틴을 포함하고 이상적으로 잘 링크되어야합니다. acos()의 값이 1.1 인 호출은 유효하지 않으므로 (잘못된 입력) 구현 된 _matherr() 핸들러에서 처리해야하는 오류가 발생해야합니다. 나는 _matherr()의 동작에 대해 옳았기를 바란다. 저에게 알려주세요. 다음 MathTest.lib

#include "MathTest.h" 
#include <iostream> 
#include <math.h> 

int _matherr(_exception* _Except) 
{ 
    std::cout << _Except->name; 
    return -1; 
} 

void MathTest::ThrowMatherr(float par) 
{ 
    float result = acos(par); 
    std::cout << result; 
} 

이 'ThrowMatherr() 메소드는 DLL에 의해 호출된다 : 다음으로 내보낼 MathTestDll.dll

void MatherrCaller::CauseMatherr() 
{ 
    MathTest* mathtest = new MathTest(); 
    mathtest->ThrowMatherr(1.1); 
} 

을 :

extern "C" __declspec(dllexport) void CallThisToCauseMatherr(); 

void CallThisToCauseMatherr() 
{ 
    MatherrCaller* caller = new MatherrCaller(); 
    caller->CauseMatherr(); 
} 

이 내 보낸 메소드는 simple 전자 테스트. UnitTest.exe

#include <windows.h> 

typedef void (*METHODTOCALL)(); 

int main() 
{ 
    HMODULE module = LoadLibrary((LPCSTR)"..\\Debug\\MatherrTestDll.dll"); 
    if(module != NULL) 
    { 
     METHODTOCALL ProcAdd = (METHODTOCALL) GetProcAddress(module, (LPCSTR)"CallThisToCauseMatherr"); 
     if (NULL != ProcAdd) 
     { 
      (ProcAdd)(); 
     } 

     FreeLibrary(module); 
    } 

    return 0; 
} 

는 모든 방법을 잘 호출됩니다. 그러나 잘못된 입력을 전달한 acos() 메서드는 _matherr() 오류 처리기를 호출하지 않습니다. 이 문제를 어떻게 해결할 수 있는지 알려주십시오.

나는 내 질문을 통해 자세한 질문을해야했다. 제발 신경 쓰지 마.

답변

0

명시 적으로 _matherr에 대한 문서에서 언급 한 :

특별한 오류 처리를 들어, _matherr의 다른 정의를 제공 할 수 있습니다. 동적 런타임 버전의 C 런타임 인 ​​C 런타임 ( ) 라이브러리 (Msvcr90.dll)를 사용하는 경우 버전으로 클라이언트 실행 파일 을 실행할 수있는 클라이언트에서 기본 _matherr 루틴을 바꿀 수 있습니다. 그러나 기본 _matherr 루틴 을 Msvcr90.dll의 DLL 클라이언트로 바꿀 수 없습니다.

EXE 모듈에 재정의해야합니다. 이를 수용하기 위해 단위 테스트를 변경하십시오.

+0

그러나 기존 시나리오에서 해결 방법이 있다고 생각합니까? 호출자가 다른 관리되는 dll이므로 lib (시스템 설계 제약)에 정의를 유지해야합니다. EXE에 넣으면 단위 테스트를위한 임시 솔루션이됩니다. – Elroy

+0

문서 소스? – Elroy

+0

Hans, 다른 오류 처리 메커니즘을 제안 하시겠습니까? – Elroy

관련 문제