0

タイトルのとおり、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 ++ DLL から任意の関数を std::function に動的にロードし ます巨大なボイラープレートを探す必要があります。


ノート:

  • 明らかに、0xDEADBEEF は必要なアドレスに置き換えられます。
  • 私はVisual Studio 2019を使用してコンパイルしていますが、明らかに一般的な回答は大歓迎です
4

1 に答える 1

7

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));
}
于 2019-04-17T21:22:46.363 に答える