최근에 직면했던 문제를 재현 할 수있는 기본 솔루션 파일 (.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() 오류 처리기를 호출하지 않습니다. 이 문제를 어떻게 해결할 수 있는지 알려주십시오.
나는 내 질문을 통해 자세한 질문을해야했다. 제발 신경 쓰지 마.
그러나 기존 시나리오에서 해결 방법이 있다고 생각합니까? 호출자가 다른 관리되는 dll이므로 lib (시스템 설계 제약)에 정의를 유지해야합니다. EXE에 넣으면 단위 테스트를위한 임시 솔루션이됩니다. – Elroy
문서 소스? – Elroy
Hans, 다른 오류 처리 메커니즘을 제안 하시겠습니까? – Elroy