для __stdcall Код (Text): ////////////////////////////////////////////////////////////////////////// template<class R> inline R __stdcall S(int a){ return ((R(__stdcall*)())a)(); } template<class R, class t1> inline R __stdcall S(int a, t1 v1){ return ((R(__stdcall*)(t1))a)(v1); } template<class R, class t1, class t2> inline R __stdcall S(int a, t1 v1, t2 v2){ return ((R(__stdcall*)(t1,t2))a)(v1,v2); } template<class R, class t1, class t2, class t3> inline R __stdcall S(int a, t1 v1, t2 v2, t3 v3){ return ((R(__stdcall*)(t1,t2,t3))a)(v1,v2,v3); } template<class R, class t1, class t2, class t3, class t4> inline R __stdcall S(int a, t1 v1, t2 v2, t3 v3, t4 v4){ return ((R(__stdcall*)(t1,t2,t3,t4))a)(v1,v2,v3,v4); } template<class R, class t1, class t2, class t3, class t4, class t5> inline R __stdcall S(int a, t1 v1, t2 v2, t3 v3, t4 v4, t5 v5){ return ((R(__stdcall*)(t1,t2,t3,t4,t5))a)(v1,v2,v3,v4,v5); } template<class R, class t1, class t2, class t3, class t4, class t5, class t6> inline R __stdcall S(int a, t1 v1, t2 v2, t3 v3, t4 v4, t5 v5, t6 v6){ return ((R(__stdcall*)(t1,t2,t3,t4,t5,t6))a)(v1,v2,v3,v4,v5,v6); } #define C_(R,A,...) S<R>(A, __VA_ARGS__) #define C(F,...) C_(T##F,A##F,__VA_ARGS__) ////////////////////////////////////////////////////////////////////////// #define TF VOID #define AF 0xcccccccc int main(){ C(F); C(F,"s",678.f); C(F,987,"s",234); C(F,876.f,123,876,"s"); C(F,876,"s",234.f,876,234); C(F,876,123,"s",876,678,77.88f); }
И правда косяк есть с __stdcall-конвенцией... Темплейты наверняка работают, но хочется всё-таки решить задачу используя макро-средства. Учитывая, что вот это вполне-себе работает: Код (Text): ((int (__cdecl *)(int, int, int))0xcccccccc)(1, 2, 3); ((int (__stdcall *)(int, int, int))0xcccccccc)(1, 2, 3); Может быть подскажете как с помощью макросов сделать следующее: macro(a1, a2, ... aN) -> строка (int, int, ..., int) ? Тогда, имея такой макрос можно его использовать для модификации существующего макроса - вставлять необходимое количество параметров одного типа (int, или DWORD или ещё что-то) в элемент макроса, определяющий указатель на функцию. Спасибо
Ну вот так вот сделал, меня устраивает в принципе. Как профит, даже типы аргументов проверяются Код (Text): #define API_CALL(F,...) (API_PROTO_##F API_ADDRESS_##F)(__VA_ARGS__) #define API_PROTO_x (int (__cdecl *)(int)) #define API_ADDRESS_x 0xcccccccc #define API_PROTO_y (int (__stdcall *)(int)) #define API_ADDRESS_y 0xcccccccc API_CALL(x, 1); API_CALL(y, 1); Всем спасибо