_matherr не вызывается при сборке в DLL - PullRequest
1 голос
/ 22 августа 2010

У меня есть файл базового решения (.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 (). Пожалуйста, дайте мне знать, как я могу это исправить.

Мне нужно было детализировать вопрос, чтобы понять мою точку зрения. Пожалуйста, не против.

1 Ответ

0 голосов
/ 22 августа 2010

Это явно упоминается в документации для _matherr:

Для специальной обработки ошибок вы можете предоставить другое определение _matherr.Если вы используете динамически связанную версию библиотеки времени выполнения C (Msvcr90.dll), вы можете заменить стандартную процедуру _matherr в исполняемом файле клиента на пользовательскую версию.Тем не менее, вы не можете заменить стандартную процедуру _matherr в клиенте DLL Msvcr90.dll.

Вам потребуется поместить переопределение в модуль EXE.Измените свой юнит-тест, чтобы приспособиться к этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...