2

私はこれらのプロジェクトを持っており、コードで生成されたいくつかの dll をインターフェイスする必要があります (不思議に思っている場合は MATLAB から)。dll は基本的に似ています。以下の 2 つの関数と 2 つの構造体が重要であるとしましょう。

function1_ptr  = (void(*)(void)) GetProcAddress(libraryHandle, "NAME_function1");
function2_ptr  = (void(*)(void)) GetProcAddress(libraryHandle, "NAME_function1");
struct1_ptr    = (STRUCT1_TYPE*) GetProcAddress(libraryHandle, "NAME_var1");
struct2_ptr    = (STRUCT2_TYPE*) GetProcAddress(libraryHandle, "NAME_var2");

dll 間では、名前のプレフィックス ( NAME )、構造体の型 (*STRUCTX_TYPE*​​)、および関数の内容のみが異なります。

これらの dll をロードするコードの要件は、関数を実行でき (問題ありません)、2 つの構造体のメンバー変数を取得および設定できることです (問題!! )変動すると問題が発生します)

そして、私の質問は次のとおり です。これらの(非常に緩い)要件が与えられた場合、そのようなdllのコレクションをインターフェースする最も簡単な方法は何でしょうか? (説明が完全でない場合は、コメントを投稿してください。投稿を編集します)

以下は、私が満足していない解決策についての私の考えです...


私の現在のコードは次のようなものです:

class Interface
{
    virtual void function1(void) = 0;
    virtual void function2(void) = 0;
    virtual void function3(void) = 0;

    virtual void setInput(STRUCT_MEMBERS_ENUM input, double value) = 0;
virtual double getOutput(STRUCT_MEMBERS_ENUM output) const = 0;
};

template <typename STRUCT1_TYPE, typename STRUCT2_TYPE>
class Model : public Interface 
{
    ...
};

これの欠点は、新しい dll ファイルを使用する場合、新しいヘッダー ファイルをインクルードする必要があることです。関連する構造体型を使用して Model の新しいインスタンスを作成し、構造体のメンバーを使用して新しい列挙型を定義する必要があります...このうち、dllのダイナミクスは失われています。

C++ にはリフレクションがないことがわかりましたが、少なくとも、私が持っている dll のコンテンツを利用するプロセスを簡素化できるヒントを期待していました。


問題を明確に説明していただければ幸いです。回答または回答への指示に非常に感謝します。

4

1 に答える 1

0

少なくとも、アクセスする dll のヘッダー ファイルが必要です。変数の構造や内容を知る一般的な方法はありません。ヘッダー ファイルを使用しても、コンパイラの実装間の実装定義の違いや、DLL のコンパイル時にどのコンパイラ スイッチがアクティブであったかによって、悩まされることがあります。

要するに、やりたいことを安全に行う方法はありません。

DLL がプライベート変数のメンバーにアクセスすることを意図している場合は、さまざまな値を取得および設定するためのアクセサー関数を提供する必要があります。

于 2012-06-26T08:32:45.403 に答える