Хочу чудо-макрос

Тема в разделе "LANGS.C", создана пользователем 7mm, 11 ноя 2010.

  1. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    для __stdcall
    Код (Text):
    1. //////////////////////////////////////////////////////////////////////////
    2. template<class R>
    3. inline R __stdcall S(int a){
    4.     return ((R(__stdcall*)())a)();
    5. }
    6. template<class R, class t1>
    7. inline R __stdcall S(int a, t1 v1){
    8.     return ((R(__stdcall*)(t1))a)(v1);
    9. }
    10. template<class R, class t1, class t2>
    11. inline R __stdcall S(int a, t1 v1, t2 v2){
    12.     return ((R(__stdcall*)(t1,t2))a)(v1,v2);
    13. }
    14. template<class R, class t1, class t2, class t3>
    15. inline R __stdcall S(int a, t1 v1, t2 v2, t3 v3){
    16.     return ((R(__stdcall*)(t1,t2,t3))a)(v1,v2,v3);
    17. }
    18. template<class R, class t1, class t2, class t3, class t4>
    19. inline R __stdcall S(int a, t1 v1, t2 v2, t3 v3, t4 v4){
    20.     return ((R(__stdcall*)(t1,t2,t3,t4))a)(v1,v2,v3,v4);
    21. }
    22. template<class R, class t1, class t2, class t3, class t4, class t5>
    23. inline R __stdcall S(int a, t1 v1, t2 v2, t3 v3, t4 v4, t5 v5){
    24.     return ((R(__stdcall*)(t1,t2,t3,t4,t5))a)(v1,v2,v3,v4,v5);
    25. }
    26. template<class R, class t1, class t2, class t3, class t4, class t5, class t6>
    27. inline R __stdcall S(int a, t1 v1, t2 v2, t3 v3, t4 v4, t5 v5, t6 v6){
    28.     return ((R(__stdcall*)(t1,t2,t3,t4,t5,t6))a)(v1,v2,v3,v4,v5,v6);
    29. }
    30. #define C_(R,A,...) S<R>(A, __VA_ARGS__)
    31. #define C(F,...) C_(T##F,A##F,__VA_ARGS__)
    32. //////////////////////////////////////////////////////////////////////////
    33. #define TF VOID
    34. #define AF 0xcccccccc
    35. int main(){
    36.     C(F);
    37.     C(F,"s",678.f);
    38.     C(F,987,"s",234);
    39.     C(F,876.f,123,876,"s");
    40.     C(F,876,"s",234.f,876,234);
    41.     C(F,876,123,"s",876,678,77.88f);
    42. }
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Норкоманы, в C++ нет вариадик макросов.
     
  3. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    И правда косяк есть с __stdcall-конвенцией... Темплейты наверняка работают, но хочется всё-таки решить задачу используя макро-средства. Учитывая, что вот это вполне-себе работает:
    Код (Text):
    1. ((int (__cdecl *)(int, int, int))0xcccccccc)(1, 2, 3);
    2. ((int (__stdcall *)(int, int, int))0xcccccccc)(1, 2, 3);
    Может быть подскажете как с помощью макросов сделать следующее:
    macro(a1, a2, ... aN) -> строка (int, int, ..., int) ? Тогда, имея такой макрос можно его использовать для модификации существующего макроса - вставлять необходимое количество параметров одного типа (int, или DWORD или ещё что-то) в элемент макроса, определяющий указатель на функцию.

    Спасибо :)
     
  4. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Ну вот так вот сделал, меня устраивает в принципе. Как профит, даже типы аргументов проверяются :)

    Код (Text):
    1. #define API_CALL(F,...) (API_PROTO_##F API_ADDRESS_##F)(__VA_ARGS__)
    2.  
    3. #define API_PROTO_x (int (__cdecl *)(int))
    4. #define API_ADDRESS_x 0xcccccccc
    5.  
    6. #define API_PROTO_y (int (__stdcall *)(int))
    7. #define API_ADDRESS_y 0xcccccccc
    8.  
    9.     API_CALL(x, 1);
    10.     API_CALL(y, 1);
    Всем спасибо :)