У меня есть файл базового решения (.sln), в котором мне удалось воспроизвести проблему, с которой я недавно столкнулся.
Содержит 3 проекта:
1.) MathTest.lib - содержит методы, которые могут вызвать математическую ошибку, например, acos (1.1).
2.) MathTestDll.dll - вызывает методы из указанной выше библиотеки.
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();
}
Этот экспортированный метод будет вызываться с помощью простого теста.
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 (). Пожалуйста, дайте мне знать, как я могу это исправить.
Мне нужно было детализировать вопрос, чтобы понять мою точку зрения. Пожалуйста, не против.