2

これを含む DLL 権限があるとします。

//DLL 
 class foo { 
  static __declspec int Add(int a, int b)
  { 
  return a+b
  }
 }

GetProc アドレスを呼び出す方法を教えてください。すなわち:

HINSTANCE hFoo = LoadLibrary("Foo.dll");
int* proc = NULL;
proc = (int*) GetProcAddress(hFoo, ??????);
 //Main Exec linked to dll

GetProcAddress を使用して dll で作成されたクラスのアドレスを取得するにはどうすればよいでしょうか?

4

3 に答える 3

3

edtheprogrammerguyは正しい。

クラスを適切に公開する方法の詳細は次のとおりです。

属性を前に付ける必要があります:

__declspec(dllexport)...

公開したいすべての機能。

これを参照してください。

C 関数の例:

__declspec(dllexport) int __cdecl Add(int a, int b)
{
  return (a + b);
}  

これは次のように簡略化できますMACROS: すべてはこの役立つページで説明されています。


C++ クラスの場合、各クラスにプレフィックスを付けるだけで済みます (すべてのメソッドではありません)。

私は通常そのようにします:

注:以下も移植性を保証します...

インクルード ファイル:

// my_macros.h
//
// Stuffs required under Windoz to export classes properly
// from the shared library...
// USAGE :
//      - Add "-DBUILD_LIB" to the compiler options
//
#ifdef __WIN32__
#ifdef BUILD_LIB
#define LIB_CLASS __declspec(dllexport)
#else
#define LIB_CLASS __declspec(dllimport)
#endif
#else
#define LIB_CLASS       // Linux & other Unices : leave it blank !
#endif

使用法 :

#include "my_macros.h"

class LIB_CLASS MyClass {
}

次に、ビルドするには、次のようにします。

  • オプション-DBUILD_LIBを通常のコンパイラ コマンド ラインに渡す
  • オプション-sharedを通常のリンカー コマンド ラインに渡す
于 2013-06-24T01:20:12.577 に答える
2

.dll からクラスのアドレスを取得することはできません。.dll からクラス インスタンスを使用する場合は、dllexport/dllimport を使用します。これにより、クラスをエクスポートして、ローカルで宣言されているかのように使用できます。

Microsoft からの参照: http://msdn.microsoft.com/en-us/library/81h27t8c(v=vs.80).aspx

于 2013-06-24T00:39:10.070 に答える
1

Explicit Linkingの例を作成しようとしていましたが、これが最終的に思いついた例です。以前に特に言及しなかったことをお詫びします。

どうぞ:

//DLL
#include "main.h"
#include <windows.h>
#include <stdexcept>

using namespace std;

class FOO{
static __declspec double ADD(double a, double b)
{
    return a+b;
}
}




   //EXEC
  #include <windows.h>
#include <iostream>
#include <stdio.h>

using namespace std;
typedef double (*MYPROC)(double, double);

int main()
{
    double d1 = 10;
    double d2 = 30;
    double retval;
    MYPROC  procx = NULL;
    DWORD err;
    HINSTANCE hDll = LoadLibrary("DynamicLinkTester.dll");
    if(hDll != NULL)
    {
    cout << "Success";
    procx = (MYPROC) GetProcAddress(hDll, "_ZN7MathDLL5MathX3ADDEdd");
    if(NULL != procx )
    {
        retval=  (procx)(d1, d2);
        cout << retval;
    }
    }


}

誰かが私と同じことを考えていたら:

dll からクラス/オブジェクトを明示的に呼び出すことはできませんが、そのメソッドを呼び出すことはできます。

于 2013-06-24T02:24:18.560 に答える