c++ - 为什么传统的 GetProcAddress 到 std::function 工作不简单
问题描述
如标题所示,我想将 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 random function from DLL into std::function 这可能有效(我还没有尝试过,我很快就会这样做)但我试图理解为什么这种神秘看起来巨大的样板是必要的。
笔记:
- 显然 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));
}
推荐阅读
- html - bootsrap 导航中是否有任何固定左侧?
- c# - “找不到资源“themes.xxx.xaml””运行时错误 - 另一个程序集中的 WPF 自定义组件
- java - 从 Rest API 返回自定义 Spring 安全消息
- highcharts - 极轨动画需要很长的路要走
- android - 搜索时间 avd 图像
- excel - Adding Rows based on Date Change
- jquery - 为什么我的 ajax 请求中出现错误 400?
- oracle - 将 Oracle Apex 5.0 IR 过滤器值传递给项目
- performance-testing - 在测试启用了 MS AD 登录的应用程序时使用 WebPageTest 工具时遇到问题
- python - 在 Python 中导入类的问题