为什么传统的 GetProcAddress 到 std::function 并不简单

Why traditional GetProcAddress to std::function is not working straightforward

本文关键字:function 不简单 std 传统 GetProcAddress 为什么      更新时间:2023-10-16

正如标题中的那样,我想将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));
}

( https://godbolt.org/z/FhaeLA )

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


相关: 我也试过这个: 指向多个参数的函数指针 C++11 std::function: 模板化 GetProcAddress 但它也未能编译(https://godbolt.org/z/1wSDZj)

我也发现了这个话题: C++ 将任意函数从DLL动态加载到std::函数中 这可能会起作用(我还没有尝试过,我很快就会这样做),但我试图理解为什么这种看起来神秘的巨大样板是必要的。


笔记:

  • 显然,0xDEADBEEF将被必要的地址所取代。
  • 我正在使用Visual Studio 2019进行编译,但显然欢迎任何通用答案

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));
}