我试图通过导出为 DLL(在 Windows/VS 2010 上)来保护一些 C++ 代码。
在下面的示例中var
,在超类构造函数中设置,调试器显示它肯定设置为引用something。
测试是在使用包含测试类的 DLL 的代码中构建的。
但是当go
从 test 的实例上调用时(从 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();
}
在消费代码中,标头是
class Base {
public:
__declspec(dllimport) Base();
};
class Test {
public:
__declspec(dllimport) Test();
__declspec(dllimport) void go();
};
实际的代码要复杂得多,但如果有人能告诉我是否有已知限制使用 dllexport 的实例变量,或者我更有可能在空指针上调用 Test 的方法,或者也许这是一个 dllexport 和继承问题。此代码在我拆分消费者代码之前有效,并且 DLL 代码在同一个项目中,它只是在拆分后才中断,我想将 dllexporting/dllimporting 函数公开到消费者使用的第二组标头中。