gpt4 book ai didi

c++ - _matherr 在内置到 DLL 中时不会被调用

转载 作者:太空宇宙 更新时间:2023-11-04 14:26:29 25 4
gpt4 key购买 nike

我有一个基本的解决方案文件 (.sln),我可以在其中重现我最近遇到的问题。

它包含 3 个项目:1.) MathTest.lib - 包含可能导致数学错误的方法,如 acos(1.1)。2.) MathTestDll.dll - 从上述库中调用方法。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() 错误处理程序。请让我知道如何解决这个问题。

我必须详细说明问题才能表达我的观点。请不要介意。

最佳答案

它在 _matherr 的文档中明确提到:

For special error handling, you can provide a different definition of _matherr. If you use the dynamically linked version of the C run-time library (Msvcr90.dll), you can replace the default _matherr routine in a client executable with a user-defined version. However, you cannot replace the default _matherr routine in a DLL client of Msvcr90.dll.

您需要将覆盖放在 EXE 模块中。更改您的单元测试以适应这一点。

关于c++ - _matherr 在内置到 DLL 中时不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3540839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com