Простой способ вызова функции с неизвестным количеством аргументов через указатель

У меня есть следующий код:

typedef void * (__stdcall * call_generic)(...);
typedef void * (__stdcall * call_push2)(unsigned long,unsigned long);

void * pfunc;
// assume pfunc is a valid pointer to external function

// this is a logically correct way of calling, however this includes:
// add esp, 8
// after the call, and that breaks my stack.
((call_generic)pfunc)(1,1);

// however, if i use this call:
((call_push2)pfunc)(1,1);
// this does not happen and code works properly.

Трудно отслеживать все вызовы и подсчитывать аргументы вручную (впереди много таких вызовов), я бы предпочел макрос или что-то для этого, но с этой ошибкой это невозможно.

Есть ли решение? Есть ли другой способ создания типа call_generic для таких вещей?

Я действительно не понимаю, почему именно он выполняет эту «очистку», но это сильно нарушает мой стек, вызывая потерю ранее определенных переменных.

5
задан Bo Persson 23 August 2011 в 16:27
поделиться