【发布时间】:2010-11-14 23:44:26
【问题描述】:
我从我在 linux (gcc) 上编写的代码创建了 c++ dll(使用 mingw),但不知何故在 VC++ 中使用它时遇到了困难。 dll 基本上只公开一个类,我为它创建了纯虚拟接口以及创建对象(唯一导出)的工厂函数,如下所示:
extern "C" __declspec(dllexport) DeviceDriverApi* GetX5Driver();
我添加了 extern "C" 以防止名称混淆,在我想使用 dll 的实际代码中,dllexport 被替换为 dllimport,DeviceDriverApi 是纯虚拟接口。
现在我在 VC++ 中编写了简单的代码,它只调用工厂函数,然后尝试删除指针。它编译没有任何问题,但是当我尝试运行它时,出现访问冲突错误。如果我尝试调用对象的任何方法,我会再次遇到访问冲突。
当我在 MinGW (gcc) 中编译相同的代码并使用相同的库时,它运行没有任何问题。所以VC++代码如何使用库和gcc代码之间肯定有一些东西(呵呵,我猜实际上有很多不同:))。
有什么想法吗?
干杯, 汤姆
编辑: 代码是:
DeviceDriverApi* x5Driver = GetX5Driver();
if (x5Driver->isConnected())
Console::WriteLine(L"Hello World");
delete x5Driver;
当我尝试调用该方法以及尝试删除指针时,它会崩溃。该对象是正确创建的(第一行)。创建对象时有一些调试输出,在出现访问冲突错误之前我可以看到它们。
【问题讨论】:
-
什么时候你会收到访问冲突错误?你的代码是什么?
-
界面中也不要使用任何非POD类型。
-
已编辑。 To ruslik:我不认为我使用任何非 POD 类型。我试图调用的测试方法只是布尔值的访问器,所以我会说它是 POD。大多数方法都返回指向 struct 的指针,但我什至没有尝试调用它们。
标签: c++ visual-studio dll mingw