如何动态使用GetProcAddress

时间:2012-06-06 21:12:16

标签: c++ c winapi visual-c++ dll

我们知道,我们可以使用GetProcAddress从DLL句柄中获取函数指针,例如在DLL中定义的方法foo:

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)

是否可以在C / C ++上实现上述callMethodDynamically?我能想到的唯一方法是我们必须将参数推送到堆栈然后调用pFunc。我猜那时它就是汇编语言。这里还有其他方法吗?我们也必须在这里处理不同的调用约定(stdcall,cdecl)。

1 个答案:

答案 0 :(得分:1)

为每个真实函数编写一个包装函数。

e.g。

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 );
}

您可以为每个函数原型编写一系列包装函数,并简化一些宏的使用。