void xGetFunctionAddress(void* FunctionDefinition, std::string FunctionName)
{
*static_cast<FARPROC*>(FunctionDefinition) = xProcAddress(Module, FunctionName.c_str());
}
在上面的代码中,我试图摆脱FARPROC*
以使其跨平台。但是,如果我转向long long int (*)()
,它会给我一个错误,它不能静态地转换为它。所以当我输入它时,它可以工作:
例如:
//This works:
void xGetFunctionAddress(void* FunctionDefinition, std::string FunctionName)
{
typedef __stdcall long long int (*Ptr)();
*static_cast<Ptr*>(FunctionDefinition) = GetProcAddress(Module, FunctionName.c_str());
}
//This doesn't:
void xGetFunctionAddress(void* FunctionDefinition, std::string FunctionName)
{
*static_cast<long long int(*)()>(FunctionDefinition) = GetProcAddress(Module, FunctionName.c_str());
}
在第二个例子中我做错了什么? :S
答案 0 :(得分:3)
您正在将void指针强制转换为函数指针,然后将其解除引用。这将计算为函数的赋值而不是函数指针。以下应该解决问题
*static_cast<long long int(__stdcall **)()>(FunctionDefinition) = GetProcAddress(Module, FunctionName.c_str());
^^
注意__stdcall
旁边的附加指针级别。
答案 1 :(得分:1)
查看特定的错误消息会很有用,但看起来您可能缺少static_cast中的__stdcall dcl-specifier。如果添加它会有效吗?
编辑:
进一步看,似乎可能不支持此功能。请看这个答案:https://stackoverflow.com/a/1096349/279130似乎解决了同样的问题。
答案 2 :(得分:1)
什么是GetProcAddress()定义为返回?
如果它是void *
,则无法将其转换为函数指针。见https://stackoverflow.com/a/1096349/37386