为什么传统的 GetProcAddress 到 std::function 并不简单
Why traditional GetProcAddress to std::function is not working straightforward
正如标题中的那样,我想将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));
}
相关文章:
- 为什么简单的算术减法在"if"条件下不起作用?
- 而循环:简单的除法程序输出零,不明白为什么
- 在Visual Studio 2017中创建的简单DLL不会在XP中加载
- 为什么一个简单的程序不能立即启动
- C++派生类重载函数(带有 std::function 参数)不可见
- [[可能]]和[[不太可能]]影响程序汇编的简单示例?
- 是否允许类类型的 std::function 成员变量(不完整类型)?
- "std::function"的简单版本:函数对象的生存期?
- 为什么传统的 GetProcAddress 到 std::function 并不简单
- "Function"不是C++型
- 为什么我们不能简单地复制 std::function
- 为什么 std::function 不是有效的模板参数,而函数指针是?
- 使用 vs typedef 指针到noexcept-function不一致
- 为什么 std::function 不能接受推导类型作为其模板参数
- 如果函数包含在命名空间中,则"go to beginning of the function"不起作用 (C++)
- 错误:"Function"不是非静态数据成员或基类 "Class"
- 为什么 GCC 的 std::function 不使用对按值传递的参数的右值引用来在其内部委托之间传递它们?
- std::is_convertible 与 std::function 不一致
- 'function'不命名类型(在 Eclipse 中)
- 为什么 std::function 不能与完美转发一起工作?