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