Как ни странно, как кажется название, то, что я хочу сделать, довольно просто. Посмотрите на эти определения:
ImportFunc(void, il2cpp_init_utf16, (const Il2CppChar* domain_name));
ImportFunc(void, il2cpp_shutdown, ());
ImportFunc(void, il2cpp_set_config_dir, (const char* config_path));
ImportFunc(void, il2cpp_set_data_dir, (const char* data_path));
ImportFunc(void, il2cpp_set_commandline_arguments, (int argc, const char* const argv[], const char* basedir));
ImportFunc(void, il2cpp_set_commandline_arguments_utf16, (int argc, const Il2CppChar* const argv[], const char* basedir));
ImportFunc(void, il2cpp_set_config_utf16, (const Il2CppChar* executablePath));
ImportFunc(void, il2cpp_set_config, (const char* executablePath));
У меня есть куча этих определений, и я хочу «превратить их в функцию». Я пробовал что-то вроде этого:
#define ImportFunc(t, n, a) \
t n a \
{ \
void* pfunc = (void*)CallSystem(kernel32, GetProcAddress, Globals::GameAssembly, n); \
return SpoofCall<type>((void*)pfunc, args...); \
}
Проблема заключается в том, как проанализировать аргументы функции и передать их другой функции. Функция SpoofCall выглядит следующим образом:
template<typename Ret = void, typename First = void*, typename Second = void*, typename Third = void*, typename Fourth = void*, typename... Stack>
__forceinline Ret SpoofCall(void* Func, First a1 = First{}, Second a2 = Second{}, Third a3 = Third{}, Fourth a4 = Fourth{}, Stack... args) {
Есть ли способ сделать это? Я могу определить функцию для принятия шаблона, а затем просто вызвать SpoofCall с этими аргументами, но я бы хотел, чтобы функция была определена с аргументами, чтобы мне было проще использовать их и интегрировать их с IntelliSense:
![screenshot](https://i.stack.imgur.com/j6BH6.png)
РЕДАКТИРОВАТЬ: Изменена опечатка в макросе