Объясните, как это работает и как конвертировать в constexpr - PullRequest
0 голосов
/ 15 мая 2019

Я читал, что лучше использовать constexpr поверх макросов, поэтому мне интересно, почему это так? Наряду с тем, как я могу преобразовать это, чтобы использовать constexpr.

Я попытался создать шаблон с 5 аргументами. как это-

constexpr auto FUNC(t1 dll, t2 name, t3 callingret, t4 args, t5 address)
{

}
#define FUNCPTR(dll, name, callingret, args, address) \
    __declspec(naked) callingret dll##_##name##args \
    { \
        static DWORD f##dll##_##name = NULL; \
        if(f##dll##_##name == NULL) \
        { \
        __asm { pushad } \
        f##dll##_##name = Offset(address); \
        __asm { popad } \
        } \
        __asm jmp [f##dll##_##name] \
    }

1 Ответ

1 голос
/ 15 мая 2019

В .NET вы можете использовать расширение DLLImport для переименования функции, импортированной из DLL .

using namespace System;
using namespace System::Runtime::InteropServices;

typedef void* HWND;
[DllImport("user32", EntryPoint = "MessageBoxA")]
extern "C" int MsgBox(
    HWND hWnd, String* lpText, String* lpCaption, unsigned int uType);

Если у вас есть адрес, как предполагалось в исходном коде, вы также можете инициализировать указатель функции, например,

const auto user32_MessageBox =
  (int(WINAPI *)( HWND, LPCWSTR, LPCWSTR, UINT )) address;

Точные типы здесь будут зависеть от происхождения address. Например, если вы получили указатель от LoadLibrary() и GetProcAddress(), то адрес возвращается из системного вызова во время выполнения. Все, что от этого зависит, не может быть constexpr.

Объявление типа адреса как DWORD и использование встроенного asm полностью непереносимы. Вышеприведенная версия переносима только в том случае, если тип address правильный, но метод, который вы используете для получения адреса, должен гарантировать, что.

Одна вещь, которую код делает, что нелегко сделать без макроса, - это объединить параметры в идентификатор. Это не должно быть необходимым, однако. (Как заметил Бен Войт, нет необходимости в локальной переменной в функции, в которую расширяется макрос, чтобы иметь уникальное имя.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...