0

MS VS 2008 に mysolution.sln があり、その下に 2 つのプロジェクトがあるとします。

1) project1.vcproj - ここには project1_file1.cpp があり、関数が定義されています。

  doSomething(){
  ...
  }

2) project2.vcproj - たとえば、ここに project2_file1.h と project2_file1.c があります。project2_file1.c で達成しようとしているのは、次のようなものです。

myJumpTable_t myJumpTable = {
   doSomething
};

どこかに構造体を定義する必要があることを理解しています。

 typedef struct _myJumpTable_t {
       void (*doSomething)();
}myJumpTable_t;

しかし、これはどこで宣言する必要があるのか​​ わかりません。また、__declspec(dllimport) を使用する必要があることも認識していますが、これを使用する方法がわかりません。これで私を助けてください。私は何日もこの問題に悩まされています。

よろしくお願いします。

4

2 に答える 2

1

まず、デフォルトでは、関数は DLL からエクスポートされません。.map ファイルまたは .map ファイルを使用して手動でエクスポートする必要があります__declspec(dllexport)

DLL からインポートするものはすべて、宣言が__declspec(dllimport). これは通常、DLL プロジェクト ファイルの一部であるヘッダー ファイルで行われ、DLL の__declspec(dllexport)コンパイル時 (.map ファイルを使用していない場合)、および__declspec(dllimport)EXE のコンパイル時に選択されます。

これを単純にするために、私はそのアドバイスに固執しません。

project1_file1.cpp

//This is exporting the function from the DLL so that it can be found
__declspec(dllexport) void doSomething() {
    ...
}

project2_file1.h

//This is where we declare the function so our code knows what it is
__declspec(dllimport) void doSomething(); 

typedef struct _myJumpTable_t {
    void (*doSomething)();
}myJumpTable_t;

project2_file1.c

myJumpTable_t myJumpTable = {
    &doSomething //& symbol here is optional, but good practice
};

doSomethingこれは元のコードに従いますが、一度宣言すると EXE で直接呼び出すことができることに注意してください。他のコードがそれを使用しない限り、テーブルは必要ありません。

于 2012-05-01T21:23:35.660 に答える
0

この DLL を使用する DLL とアプリケーションを構築していますか、それとも両方のプロジェクトが単なる実行可能モジュールであり、コードを再利用しようとしていますか?

于 2012-05-02T20:44:55.843 に答える