Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么传统的GetProcAddress到std::函数不能直接工作_C++_C++17_Dynamic Import - Fatal编程技术网

C++ 为什么传统的GetProcAddress到std::函数不能直接工作

C++ 为什么传统的GetProcAddress到std::函数不能直接工作,c++,c++17,dynamic-import,C++,C++17,Dynamic Import,正如在标题中一样,我想将GetProcAddress转换为std::function。是的,在堆栈溢出中有多种解决方案,但没有一种能够真正解释为什么需要这些解决方法。我不能真正理解确切的错误信息以及它发生的原因。示例源很简单: #include <functional> #include <Windows.h> using fn_NtAllocateVirtualMemory = NTSTATUS (NTAPI*)( HANDLE Proces

正如在标题中一样,我想将GetProcAddress转换为std::function。是的,在堆栈溢出中有多种解决方案,但没有一种能够真正解释为什么需要这些解决方法。我不能真正理解确切的错误信息以及它发生的原因。示例源很简单:

#include <functional>
#include <Windows.h>

using fn_NtAllocateVirtualMemory = NTSTATUS (NTAPI*)(
        HANDLE      ProcessHandle,
        PVOID*      BaseAddress,
        ULONG_PTR   ZeroBits,
        PSIZE_T     RegionSize,
        ULONG       AllocationType,
        ULONG       Protect
    );

int main()
{
    std::function<fn_NtAllocateVirtualMemory> myFn(reinterpret_cast<fn_NtAllocateVirtualMemory>(0xDEADBABE));
}
#包括
#包括
使用fn_NtAllocateVirtualMemory=NTSTATUS(NTAPI*)(
句柄进程句柄,
PVOID*基地址,
ULONG_PTR零位,
PSIZE\u T RegionSize,
ULONG分配类型,
乌龙保护
);
int main()
{
std::函数myFn(重新解释(0xDEADBABE));
}
()

所以,我的问题是,为什么这是错误的


相关的: 我也试过: 但它也未能编译()

我还发现了这个话题: 这可能会起作用(我还没有尝试过,我很快就会做),但我试图理解为什么这种看起来神秘的巨大样板是必要的


注:

  • 很明显,我们将用必要的地址来代替
  • 我正在使用VisualStudio2019进行编译,但显然欢迎任何通用答案

std::function
将签名作为模板参数,而不是指针

因此,它应该是:

using fn_NtAllocateVirtualMemory = NTSTATUS NTAPI (
        HANDLE      ProcessHandle,
        PVOID*      BaseAddress,
        ULONG_PTR   ZeroBits,
        PSIZE_T     RegionSize,
        ULONG       AllocationType,
        ULONG       Protect
    );

int main()
{
    std::function<fn_NtAllocateVirtualMemory> myFn(
        reinterpret_cast<fn_NtAllocateVirtualMemory*>(0xDEADBABE));
}
使用fn_NtAllocateVirtualMemory=NTSTATUS NTAPI(
句柄进程句柄,
PVOID*基地址,
ULONG_PTR零位,
PSIZE\u T RegionSize,
ULONG分配类型,
乌龙保护
);
int main()
{
std::函数myFn(
重新解释(0xDEADBABE));
}

啊,我明白了。请注意,您应该更改NTAPI和NTSTATUS的顺序,因为这样会失败。除此之外,它很酷:)@original.roland:订单改变了。