1

ご存知のように、GetProcAddress を使用して、DLL で定義されたメソッド foo などの DLL ハンドルから関数ポインターを取得できます。

int foo(long)

foo 関数に対して、次のような関数ポインタを取得できます。

typedef int(* FOO_FUNC)(long)
FOO_FUNC pFooFunc = (FOO_FUNC) GetProcAddress(dllHandle, "foo")

ただし、さらに動的にすることができるかどうかを考えています。たとえば、現在のメソッドに適した入力引数とその型のリストがあることを知っており、dll でこのメソッドを呼び出してからリストを取得したいと考えています。出力引数の (型も)

//VARIANT would be able to hold different type of data with different type
std::vector<VARIANT> inputArguments;
std::string methodName = "foo"
void * pFunc = GetProcAddress(dllHandle, methodName.c_str())
std::vector<VARIANT> outputArguments;
callMethodDynamically(pFunc, inputArgument, &outputArguments)

上記の callMethodDynamically を C/C++ で実装することは可能ですか? 私が考えることができる唯一の方法は、引数をスタックにプッシュしてから pFunc を呼び出す必要があるということです。それならアセンブリ言語になると思います。ここに他の方法はありますか?ここでも、異なる呼び出し規則 (stdcall、cdecl) を処理する必要があります。

4

1 に答える 1

2

実際の関数ごとにラッパー関数を記述します。

例えば

int addNumbers( int x, int y ) { return x + y; }

void addNumbersW( std::vector<VARIANT>& inArgs, std::vector<VARIANT>& outArgs )
{
    // decode in args somehow
    int x = getArg( inArgs, 0 );
    int y = getArg( inArgs, 1 );
    int r = addNumbers( x, y );
    addArg( outArgs, r );
}

おそらく、関数プロトタイプごとに一連のラッパー関数を記述し、いくつかのマクロでの使用を簡素化することができます。

于 2012-06-22T16:09:21.950 に答える