C++ __declspec( dllexport ) 函数无法访问实例变量

标签 c++ dllexport declspec

我试图通过导出为 DLL(在 Windows/VS 2010 上)来保护一些 C++ 代码。

在下面的示例中,var 在父类(super class)构造函数中设置,并且调试器显示它肯定设置为引用某物

测试是在使用包含测试类的 DLL 的代码中构造的。

但是当 go 被一个测试实例调用时(从 DLL 调用,但调用方法由 DLL 消费者调用) var 是一个空指针(它的值为 0)。

这是一种简化,因为我不允许共享实际代码。

//Headers

class Base {
  public:
    __declspec(dllexport) Base();      
  private:
    Foo* var;
};

class Test : Base {
public:
  __declspec(dllexport) Test();
  __declspec(dllexport) void go();
private:
};

//Body

Base::Base() {
  var = new Foo();
}

Test::Test() : Base() {
}

void Test::go() {
  var->do_something();
}

在消费代码中,header是

class Base {
public:
  __declspec(dllimport) Base();
}; 

class Test {
public:
  __declspec(dllimport) Test();
  __declspec(dllimport) void go();
};

实际的代码要复杂得多,但如果有人能告诉我是否有已知的 dllexport 实例变量限制,或者我是否更有可能在空指针上调用方法,我将不胜感激测试,或者它可能是一个 dllexport 和继承问题。这段代码在我拆分消费者代码之前有效,DLL 代码在同一个项目中,它只是在拆分后才被破坏,我想将 dllexporting/dllimporting 函数公开到消费者使用的第二组 header 中。

最佳答案

当您在“消费代码”中按值从一个地方传递一个Test 到另一个地方时,您将导致slicing发生的原因是客户端代码不知道该变量并为类 Test 计算了错误的大小。

要解决这个问题,您也应该在客户端代码中声明变量,或者您可以提供某种静态工厂函数,只允许客户端代码将指针传递给 Test周围是为了避免切片。

关于C++ __declspec( dllexport ) 函数无法访问实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9202459/

相关文章:

c++ - 将 C 头文件中的 __declspec 转换为 Delphi

c++ - Windows:如何查询低级键盘 Hook 中修改键的状态?

c++ - 默认参数值错误 [Visual C++ 2008 中的错误?]

c++ - 以分钟为单位查找与 GMT 的本地时区差异

c# - 如何使用 DLL(用 C 编写)在 C# 中创建结构数组?

c++ - __declspec(dllimport) 导致编译器在 MSVC 2010 上崩溃

c++ - 运算符重载以构造异常消息

c++ - 将一个dll导入另一个dll C++

c++ - dllexport 一个全内联类?

c++ - `__declspec(align(#))` 是如何工作的?