升级Visual Studio后Fortran DLL出现异常
Exception in Fortran DLL after upgrading Visual Studio
我有一个C++DLL。我们最初在Visual Studio 2005中开发了它,最近将它升级到了Visual Studio 2013。然后,此DLL调用Fortran DLL以实现某些功能(Fortran DLL由无法共享源代码的第三方开发人员提供)。最近,对于一些输入,对Fortran库的调用开始抛出一个异常:
First-chance exception at 0x1C00BA50 in Application.exe: 0xC0000005: Access violation executing location 0x1C00BA50.
仅当从Windows 7上Visual Studio 2013生成的可执行文件调用Fortran DLL时,才会发生此异常。当我用Visual Studio 2005可执行文件中的相同输入调用同一个Fortran DLL时,没有异常,Fortran DLL会产生正确的结果。此外,在Windows XP SP3上运行Visual Studio 2005解决方案也不会产生错误。
支持细节:
- 调用Fortran的C++DLL是一个32位x86 DLL
- Fortran DLL是针对DFort 6.1a构建的
- 在依赖性walker中,需要:DFORRT.DLL、MSVCRT.DLL和KERNEL32.DLL
- C++可执行文件是使用"Visual Studio 2013-Windows XP(v120_XP)"平台工具集为x86构建的
- 崩溃不会发生在Windows XP SP3上;它在32位和64位Windows7机器上都可以。我正在设置一个Vista环境在那里进行测试,但几天内不会有结果
如果有帮助,函数签名是:
extern "C"
{
typedef long (__stdcall *FUNCTIONID)
(
float* array1,
float* array2,
float* array3,
long& numItems,
long& numThings,
float* thingData,
float* thing2data,
float& result,
long* resArray,
float* resArray2,
float* resArray3);
}
库加载方式:
m_funcDLL = ::LoadLibrary("DLLNAME.DLL");
此外,我们称之为:
FUNCTIONID pfnFUNC = nullptr;
pfnFUNC = (FUNCTIONID)GetProcAddress(m_funcDLL, "FUNCNAME");
if(pfnFUNC) {
try {
iErr = (*pfnFUNC)( args...);
}
}
args是静态数组和动态数组的混合体(尽管我们已经用C++11的std::array和std::vector进行了实验来传递信息;使用这两种容器类型会得到相同的错误)。
我们在构建中没有使用Unicode(目前这是一个愿望列表项),所以我们使用多字节字符集(尽管传入的数组都不是字符数组)。
我的主要问题是:有人知道Windows 7上Visual Studio 2013的二进制兼容性问题会导致这样的崩溃吗?有没有我应该看的东西我没有?
如果发生以下一种或多种情况,链接到不同版本的运行库(可能还有其他库)的DLL和使用DLL的代码有被破坏的危险:
- DLL的接口使用类/结构,其中的大小可能因运行库的版本而异。(一个不幸的成员可能就足够了)
- 没有在接口的同一侧分配/释放堆对象
- 有时人们会玩编译器关于对齐的设置。也许不同版本的编译器也会改变他们的"策略"
- 注意#pragma(pack,..)、__declspec(align())等
- 在VS的旧版本中,有"单线程"answers"多线程"版本的运行时库。混合使用未链接到同一类型库的DLL和应用程序可能会导致问题
- 头文件中的
#include <seeminglyharmlessheader.h>
,应用程序和DLL都可以看到,可能会有一些令人讨厌的惊喜 - 可能是其他编译器/链接器设置中的(未注意到的)更改,例如关于异常处理
我不能完全理解你在问题部分所说的32位/64位的内容。我不认为,混合这两种作品,但我也认为你没有尝试。
- 当我使用 C++ 中的 C# dll 来使用 Selenium 时,存在异常处理问题
- 加载与引用 .NET DLL 位于同一文件夹中的引用的 .NET DLL 时"Not found"异常
- 在 ******.exe 中0x00000000772CA267 (ntdll.dll) 处未处理的异常:0xC0000
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 发生此错误:在0x0F2BFB7C(基于.dll)时引发异常 尝试更改大小是问题吗?
- 为什么g_object_set抛出异常(vcruntime140.dll)?
- 处理 c++ DLL 的异常
- 在OpenCV_core310.dll中使用findContours函数时,OpenCV引发未处理的异常
- 在 Project70.exe 中的0x0F4D514F (vcruntime140d.dll) 引发异常:0xC000
- 在0x5914F3BE抛出异常(基于.dll)
- 使用 C++ dll 运行 c# 应用程序会生成无法加载异常
- 核心消息传递中未处理的异常.dll在程序关闭期间
- 在 Hello World.exe 中0x0F828F0E (ucrtbased.dll) 处未处理的异常: 0xC00
- Windows错误:异常:使用从C++到Python的ctypes创建DLL时出现访问冲突或Windows错误193
- 如何在C++中修复PyImport_Import(python35.dll中的异常)
- 加载C DLL文件时,如何修复异常_access_violation
- 实验室中0x6BE20E11 (ucrtbased.dll) 的未处理异常.exe: 0xC0000005:访问冲突读取
- 在 "<name>.exe" 中0x00007FFF168E1657 (vcruntime140d.dll) 引发异常:0xC0000005:访问冲突写入位置0x0000000000000
- mystring.exe中的0x0FC9E559(ucrtbaseed.dll)的未经手法异常:0xc0000005:访
- C++Windows DLL:不同函数中的异常处理