c++ - 我可以用 VC++ 2008 创建 Dll 并在 VC++ 6 中使用它吗?

标签 c++ visual-c++ dll msvcr90.dll

我用 VC++ 2008 制作了一个 DLL,当我在控制台应用程序 VC++ 6.0 中使用它时,出现异常:

(msvcr90.dll): 0xc0000005: Access Violation

最佳答案

Access Violation 在这种情况下可能意味着很多事情,而 msvcr90.dll 引用可能具有很大的误导性。如果您将无效数据传递给任何 MSVC 标准库函数,访问冲突将发生在 msvcr90.dll 中,而不是在您的代码中(查看堆栈跟踪或查看异常信息时)。

也就是说,理论上,在 VC++ 6 中使用 VC9 DLL 应该不会有问题,因为 ABI 没有改变并且 PE 格式是相同的。如果 msvcrt9.dll 在您的平台上不受支持(例如,如果您在 Windows NT 上运行 MSVC6),您可能会遇到问题,否则这意味着您需要检查您的代码。

我的意思是:附加一个调试器,看看幕后发生了什么!

还有一点要注意:当动态使用不同版本的 MSVC 库时,您不得在一个库中分配数据并在另一个库中释放它,因为不能保证它们使用相同的堆并且您可能会出现内存损坏(和 Access Violation 错误)像这样很容易。这也意味着,如果您正在编写 C++,则不得创建一个对象,然后通过返回值将其传递给调用应用程序,因为这将在幕后发生。

关于c++ - 我可以用 VC++ 2008 创建 Dll 并在 VC++ 6 中使用它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9979859/

相关文章:

c++ - 计算点云中每个点的法线?

c# - c++ 从 c#-dll 调用函数失败

c++ - 缓存 OpenGL 纹理

c++ - 使用运算符!否定重载的 bool 谓词

c++ - 如何构建捕获所有异常的 C++ Dll 包装器?

c++ - 使用 Windows 套接字进行蓝牙编程 - 范围内的设备

winapi - 如何获取 CPrintDialogEx 中属性表的句柄

c# - 无法在我的 Azure WorkerRole 项目中加载 DLL 'Microsoft.WITDataStore64.dll'

c# - Easyhook:如何从使用 LoadLibrary 加载的 DLL 中 Hook 函数

c++ - 如何通过 C++ 中的构造函数传递类/对象