c++ - MS Detours - DetourAttach 失败

标签 c++ c winapi syntax-error detours

在这里感觉很愚蠢,但为什么这段代码在 Visual 中给我一个语法错误 Studio 何时尝试编译它?

    DetourAttach(&(PVOID&)true_create_file, create_file);

编译器提示(在 PVOID 之后加下划线)

Error (active) E0018 expected a ')'

代码是从Detours example page中直接复制过来的.我假设这是因为我的包含文件具有 .c 扩展名,因此被 VS 编译为 C,而示例具有 .cpp 扩展名并被编译为 C++。

我不完全确定这一行在所有 Actor 阵容中发生了什么。为什么 C 编译器不喜欢它,我如何让它编译这一行?

下面是完整的代码 list :

#include <Windows.h>
#include "detours.h"
#pragma comment(lib, "detours.lib")

static HANDLE(WINAPI *true_create_file) (LPCSTR file, DWORD access,
    DWORD share, LPSECURITY_ATTRIBUTES sec, DWORD disp, DWORD flags,
    HANDLE tmpl) = CreateFileA;

HANDLE WINAPI create_file(LPCSTR file, DWORD access, DWORD share,
    LPSECURITY_ATTRIBUTES sec, DWORD disp, DWORD flags, HANDLE tmpl) {
}

int hook_create_file() {
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    /* syntax error */
    DetourAttach(&(PVOID&)true_create_file, create_file);
    DetourTransactionCommit();
}

PVOID 定义为

typedef void *PVOID;

最佳答案

&(PVOID&) 部分:首先将参数转换为对 void 指针的引用,然后获取它的地址。正如评论指出的那样,您将其编译为 C,但 C 中不存在引用操作。因此编译器将“&”识别为获取地址,但仅在其后面获取“)”,然后得到 expected a ') ' 错误。

由于PVOID&在这里没有意义,只是为了增加可读性。您可以在此处使用 PVOID 而不是 PVOID&:

DetourAttach(&(PVOID)true_create_file, create_file);

您还可以从 here 获取 DetourAttach 函数的详细信息.

关于c++ - MS Detours - DetourAttach 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56305389/

相关文章:

c++ - 使用 std::map 部分匹配键

带有参数和快速调用的 C++ typedef

c++ - 使用getline c++将每一行输入存储在一个数组中

c - Bind 在内核空间内部如何工作?

windows - 谁改变时间?

c++ - 如何读取映射文件中的结构 vector ?

c++ - 如何使用此 OpenMP 关键部分避免此原始指针?

c++ - 我可以对宏使用哪些技巧?

c - 为什么C不能直接给数组赋值,而是可以在struct中给数组赋值?

c++ - 将光标定位在 RichEdit 控件中文本的末尾