C++ 为什么传统的GetProcAddress到std::函数不能直接工作
正如在标题中一样,我想将GetProcAddress转换为std::function。是的,在堆栈溢出中有多种解决方案,但没有一种能够真正解释为什么需要这些解决方法。我不能真正理解确切的错误信息以及它发生的原因。示例源很简单: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
#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:订单改变了。