使用 DLL 中的C++函数进行访问冲突
Access violation using a C++ function from a DLL
我有一个用C++编写的游戏引擎,我正在将其移植到Windows(从Mac)。它使用 C++11 和 OpenGL,并且出于所有意图和目的,它可以运行!
我正在为我的游戏引擎使用 DLL,该引擎在运行时隐式链接到游戏.exe
。问题是,当我尝试使用 DLL 中的实用程序类时,FileSystem
,查找资源文件(纹理,但我认为这并不重要),出现此错误:
First-chance exception at 0x00007FF9CF988830 (PocoFoundation64.dll) in TestEquinox.exe: 0xC0000005: Access violation reading location 0x000000136A4FF000.
当我从 DLL 调用我的 FileSystem
类的此方法时,问题就来了(它旨在采用文件名/部分路径,并在各个地方查找以查找完整路径):
Poco::Path FileSystem::Get(const std::string &filename) {
std::vector<Poco::Path> paths = {
filename,
ResourceFolder() / filename //<<<<< ERROR HERE
};
for (const Poco::Path &path : paths) {
try {
if (Poco::File(path).exists()) {
return path;
}
} catch (...) { }
}
Logger("FileSystem", std::cerr) << "Could not find file '" << filename << "'!";
return {};
}
Visual Studio将错误显示为在ResourceFolder()
调用时,来自同一类的另一个方法也在DLL中。这似乎是这样的:
Poco::Path FileSystem::ResourceFolder() {
Poco::Path userData;
//--SNIP-- (other OS's #ifdef'd here)
// GAME->StartupPath is a std::string containing the exe's parent folder
userData = (Poco::Path(GAME->StartupPath).parent() / "Resources").makeDirectory();
//--SNIP-- (and here)
try {
if (!Poco::File(userData).exists()) {
Poco::File(userData).createDirectories();
}
} catch (...) {}
return userData;
}
从外观上看,这与Poco
的数据类型没有正确实例化有关?我已经使用所有相同的编译器设置(64 位、多字节字符集、VS2013)从源代码构建了它,所以我看不出它怎么可能是名称重整/数据布局问题。
还有一件事需要注意 - 我将整个 FileSystem
类从 DLL 复制到我的游戏项目的本地类,称为 FileSystem2
。使用相同的参数调用FileSystem2::Get
工作正常且没有崩溃,尽管是相同的代码。
希望有人能指出我正确的方向?!
通常,此类错误源于使用模块使用的不兼容的运行时库。 请检查 Visual Studio 属性中所有模块的以下内容:
Project Properties -> C/C++ -> Code Generation -> Runtime Library
.
运行时设置(多线程 DLL、多线程调试 DLL 等)必须与要编译的所有模块匹配。 如果它们不匹配,请选择一个运行时,然后使用该运行时重新生成所有模块。
- 使用 EvtSetChannelConfigProperty() 函数时出现访问冲突错误
- (此函数用于计算 SMA).在 FA.exe 中0x00509159引发异常: 0xC0000005:访问冲突读取位置0
- 函数 AfxEndThread 中的读取访问冲突"pThread-> was nullptr"
- 读取类的析构函数中的位置时发生访问冲突
- 在 C 代码中调用 Python 函数时第三次出现访问冲突写入位置错误
- 使用向量的函数崩溃,调试器说访问冲突读取位置
- 读取IMAGE_EXPORT_DIRECTORY以查找导出的函数名称会导致访问冲突
- C++ python 中的函数来自使用 ctypes 的.dll - 找不到函数和访问冲突
- 进入函数之前的访问冲突异常
- 删除函数 c++ 的读取访问冲突异常
- 使用全局引用调用函数时访问冲突
- 调用基构造函数时遇到问题 - 获取读取访问冲突
- 为什么我的布尔函数返回 true 会导致读取访问冲突?
- 从C#返回调用C++dll函数的值时发生访问冲突
- Qlist<QCameraInfo> 导致 QList 析构函数中的访问冲突
- 尝试使用成员函数访问动态分配的成员变量时读取访问冲突
- 使用JNI从Java调用本机(C++)函数时发生访问冲突:这是我的代码问题,还是已知问题
- 0xC0000005:访问冲突读取位置0x00000000哈希函数
- 单链表添加函数-读取访问冲突
- mfc应用程序结束后,CMainFrame的析构函数调用发生访问冲突