与标题中一样,我想将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)
所以,我的问题是为什么错了?
相关: 我也试过这个: Function pointer to multiple argument C++11 std::function: Templating GetProcAddress 但是它也无法编译(https://godbolt.org/z/1wSDZj)
我也找到了这个主题: C++ Dynamically load arbitrary function from DLL into std::function (我还没有尝试过,我会尽快做的)可能可行。但是我试图理解为什么这种看起来像神秘的巨大样板是必要的。
注意:
答案 0 :(得分:5)
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));
}