我的演员错了吗?

时间:2013-06-02 01:11:22

标签: c++

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

3 个答案:

答案 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