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