c++ - 与 PVOID 的参数类型不兼容

标签 c++ visual-studio-2015 detours

使用绕行 v3,我收到此错误:

argument of type "signed int (Std::*)(int a1, int a2, int a3)" is incompatible with parameter of type "PVOID"   Std.cpp 39  

当我尝试从我的类的函数中使用 DetourAttach 时。

Std* _std = new Std();

case DLL_PROCESS_ATTACH:
    DetourAttach(&(PVOID&)_std->m_pKey, &Std::m_Key);

// or if I do this
DetourAttach(&(PVOID&)_std->m_pKey, _std->m_Key);
// the error becomes Std::m_Key non-stardard syntax; use & to create a pointer to member

我知道我可以在不使用类的情况下做到这一点,但我希望这样做。有什么建议吗?


更新

DetourAttach 签名(也可以找到 here ):

LONG WINAPI DetourAttach(PVOID *ppPointer,
                         PVOID pDetour)

至于Std::m_Key

int Std::m_Key(int a1, int a2, int a3)
{
    return m_pKey(a1, a2, a3);
}

最佳答案

这个函数签名是:

LONG DetourAttach(
    PVOID * ppPointer,
    PVOID pDetour
    );

第一个参数是指向要迂回 的函数的指针。第二个是您自己的函数,将被调用。由于只能提供单个指针,因此您无法在类实例上调用方法。要调用类实例方法,您需要一个指向类对象的指针和一个指向方法的指针。

所以你需要一个免费的功能(非成员(member))来让它工作。

[编辑]

你的自由函数可以调用你的 Std 类实例方法:

Std* _std = new Std();
int m_Global_Key(int a1, int a2, int a3)
{
    return _std->m_Key(a1, a2, a3);
}

或者你可以让 Std::m_Key 成为一个静态函数,但它与全局函数没有太大区别。

关于c++ - 与 PVOID 的参数类型不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36007262/

相关文章:

c++ - 遇到微软弯路的麻烦

C++/Windows API - 无法找到 CreateWindow

c++ - 在编译时使用模板验证类型

c++ - 生成缓冲区时出现 OpenGL 段错误

c++ - 这个独特的字符串函数的执行时间是否从天真的 O(n^2) 方法中减少了?

c# - 通过 project.json 将内容文件复制到 DNX 控制台应用程序的输出目录

c# - 升级到VS2015时突然出现警告CS0436

c# - SSIS:列大小未根据查询更改

c++ - 使用 c++ boost::python 从 python 函数返回的列表中获取数据?

c++ - Deviarev2 Hook API : Hook into existing process winapi calls?