(Windows/VS 2010 上で) DLL としてエクスポートすることにより、一部の C++ コードを保護しようとしています。
以下の例でvar
は、スーパークラス コンストラクターで設定されており、デバッガーは、それがsomethingを参照するように確実に設定されていることを示しています。
Test は、Test クラスが含まれている DLL を使用するコードで構築されます。
ただしgo
、テストのインスタンスから呼び出される場合 (DLL から呼び出されますが、呼び出し元のメソッドは DLL コンシューマーによって呼び出されます)var
は null ポインターです (値は 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 の null ポインターでメソッドを呼び出している可能性が高いかどうかを誰かに教えていただければ幸いです。おそらく、dllexport と継承の問題です。このコードは、消費者コードを分割する前に機能し、DLL コードは同じプロジェクトにありました。分割してから壊れただけで、消費者が使用するヘッダーの 2 番目のセットに公開したい dllexporting/dllimporting 関数です。