我试图通过导出为 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/