内置到DLL中时不会调用_matherr

时间:2010-08-22 09:06:55

标签: c++ math dll

我有一个基本的解决方案文件(.sln),我能够重现我最近遇到的问题。

它包含3个项目: 1.)MathTest.lib - 包含可能导致数学错误的方法,如acos(1.1)。 2.)MathTestDll.dll - 从上面的lib调用方法。 3.)UnitTest.exe - 调用DLL中导致错误的导出方法。

我想做的事情很简单: 以下代码包含_matherr()例程,理想情况下应该链接正常。对值为1.1的acos()的调用无效(无效输入),并且应该导致应由已实现的_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 :(得分:0)

在_matherr的文档中明确提到:

  

对于特殊错误处理,您可以   提供不同的定义   _matherr。如果使用C运行时的动态链接版本   库(Msvcr90.dll),你可以替换   a中的默认_matherr例程   客户端可执行文件与用户定义   版。但是,你不能   替换默认的_matherr例程   在Msvcr90.dll的DLL客户端中。

您需要将覆盖放在EXE模块中。改变你的单元测试以适应这个。