0

(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 関数です。

4

3 に答える 3

1

Test「消費コード」のある場所から別の場所にby値を渡すと、クライアントコードが変数を認識せず、クラスの誤ったサイズを計算するため、スライスTestが発生します。

この問題を解決するには、クライアントコードでも変数を宣言する必要があります。または、ある種の静的ファクトリ関数を提供し、Testスライスを回避するためにクライアントコードがポインタをsに渡すことのみを許可することもできます。

于 2012-02-08T22:37:12.060 に答える
0

使用しない理由はありますか:

#ifdef IN_FOO_PROJECT
# define fooEXPORT __declspec(dllexport)
#else
# define fooEXPORT __declspec(dllimport)
#endif

class fooEXPORT exportClass
{
public:
  void function( void );
  Foo * var;
}

クラス (またはクラスの一部) を隠したい場合は、プライベート メンバーとして使用できます。

#ifdef IN_FOO_PROJECT
# define fooEXPORT __declspec(dllexport)
#else
# define fooEXPORT __declspec(dllimport)
#endif

class classToHide;

class fooEXPORT exportClass
{
public:
  void function( void );
  classToHide * var;
}

そしてCppで:

#include "exportClass.h"
#include "classToHide.h"

void exportClass::function( void )
{
  var->function();
}
于 2012-02-09T15:15:20.420 に答える
0

顧客に提供されたコードからインスタンス変数を削除すると、独自のコードのみがオブジェクトの実際のサイズを認識し、それを作成できます。私の頭の上から、これについて2つの方法があります。

  1. クラスのインスタンスを作成する createTest 静的関数を提供します (ファクトリ メソッド)。ここで行う最も良いことは、純粋なインターフェイス (インスタンス変数なし) を提供することです。

  2. クラスの特定の部分だけを非表示にしたい場合は、pimpl イディオム (ウィキペディアの記事) を使用できます。

于 2012-02-08T22:47:48.297 に答える