我試圖通過導出爲DLL(在Windows/VS 2010上)來保護一些C++代碼。C++ __declspec(dllexport)函數無法訪問實例變量
在下面var
的例子被設置在父類的構造,並且調試器顯示它肯定是設置爲引用東西。
測試是在代碼中構建的,該代碼使用包含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實例變量的限制,或者如果我更可能調用Test的空指針的方法,或者它可能是一個dllexport和繼承問題。這段代碼在我將拆分消費者代碼和DLL代碼放在同一個項目中之前工作過,它只是在拆分它之後才破解,我想將dllexporting/dllimporting函數公開給消費者使用的第二組頭。
感謝香港專業教育學院更新了問題,因爲我REA在組合中也有繼承。我試過__declspec(dllexport)Foo * var;但我得到了「__declspec修飾符不適用於此聲明」 – 2012-02-08 22:42:23
@PaulRidgway啊,對不起,我錯了,只是添加'Foo * var'到客戶端的'Base'上(或者你甚至可以用'void * var'如果'sizeof(void *)== sizeof(Foo *)') – 2012-02-08 22:47:15
感謝 - 工作(只嘗試Foo *雖然) – 2012-02-09 17:41:01