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

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

编译器抱怨(在PVOID后面加上&)



该代码是从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定义为

最佳答案

&(PVOID&)部分:将参数强制转换为指向void的指针的引用,然后获取其地址。正如注释所指出的那样,您将其编译为C,但是在C中不存在引用操作。因此,编译器将“&”识别为接收地址,但只能将其后面的“)”识别为地址,然后出现expected a ')'错误。

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

DetourAttach(&(PVOID)true_create_file, create_file);

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

10-08 08:22