首页 > 解决方案 > 为什么传统的 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 这可能有效(我还没有尝试过,我很快就会这样做)但我试图理解为什么这种神秘看起来巨大的样板是必要的。


笔记:

标签: c++c++17dynamic-import

解决方案


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

推荐阅读