Почему традиционный GetProcAddress для std :: function не работает напрямую - PullRequest
0 голосов
/ 18 апреля 2019

Как и в заголовке, я хотел бы преобразовать 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: Templating GetProcAddress Но также не удалось скомпилировать (https://godbolt.org/z/1wSDZj)

Я также нашел эту тему: C ++ Динамически загружать произвольную функцию из DLL в std :: function Что может сработать (я еще не пробовал, скоро сделаю) , но я пытаюсь понять, зачем нужен такой загадочный огромный шаблон.


Примечания:

  • Очевидно, что 0xDEADBEEF будет заменен на необходимый адрес.
  • Я использую Visual Studio 2019 для компиляции, но, очевидно, приветствуется любой общий ответ

1 Ответ

5 голосов
/ 18 апреля 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...