Трюк с call_generic
не будет работать с функциями, которые должны вызываться с __stdcall
соглашением о вызовах. Это связано с тем, что __stdcall
подразумевает, что функция должна очищать стек, а функции OTOH (с аргументами ...
) могут этого не делать, поскольку они не знают об аргументах.
Таким образом, пометка функции с переменным значением __stdcall
- это все равно что выстрелить себе в ногу.
В вашем конкретном случае я бы пошел в направлении написания макросов. Я не вижу тривиального трюка, который бы соответствовал вашим потребностям.
EDIT
Одним из методов может быть использование шаблонных классов. Например:
// any __stdcall function returning void taking 2 arguments
template <typename T1, typename T2>
struct FuncCaller_2
{
typedef void * (__stdcall * FN)(T1, T2);
static void Call(PVOID pfn, T1 t1, T2 t2)
{
((FN) pfn)(t1, t2);
}
};
// call your function
FuncCaller_2<int, long>::Call(pfn, 12, 19);
Вам потребуется создать такой класс для каждого числа аргументов (0, 1, 2, 3, ...).
Нет необходимости говорить, что этот метод "небезопасен" - т. Е. Во время компиляции нет проверки правильности вызова функции.