Описание функции с переменным числом параметров.

Тема в разделе "LANGS.C", создана пользователем Quark, 17 авг 2007.

  1. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Можно ли (VC6) описать функцию, чтобы компилятор сам определял количество параметров при её вызове и автоматически подсчитывал как ему очистить стек... в в апи это делается, например, так:
    Код (Text):
    1. int __cdecl wsprintfA(   __out LPSTR,   __in __format_string LPCSTR,   ...);
    но как мне описать свою функцию и узнать сколько параметров передаётся ей при вызове?

    Вообще конечная цель - написать функцию вызова сервисов. то есть что-то типа:
    Код (Text):
    1. NTSTATUS CallService(ULONG ServiceNumber,IN ...)
    2. {
    3.  
    4. __asm{
    5.     ...
    6.      lea    edx,...
    7.      mov   eax,ServiceNumber
    8.      int     0x2E}
    9.  
    10.  }
     
  2. Sni4ok

    Sni4ok New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2007
    Сообщения:
    1
    гугли по кеям
    va_list, va_start, va_end
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Первое просто, со вторым сложнее, т.к. работа по определению кол-ва параметров и их типов ложится полностью на тебя. В случае *printf за это отвечает строка форматирования, в твоём - знание кол-ва параметров исходя из знания прототипа вызываемого сервиса. Смотри доку по #2, но мне кажется, что есть подход проще - как сделано в самой системе.
     
  4. Quark

    Quark New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2007
    Сообщения:
    211
    Разобрался. вобщем нужно просто определить __cdecl функцию:
    Код (Text):
    1. NTSTATUS __cdecl CallService(ULONG ServiceNumber,...)
    2. {
    3.     __asm{
    4.         lea  edx,[esp+8]
    5.         mov  eax,ServiceNumber
    6.         int  0x2E}
    7. }
    компилятор смотрит сколько я положил в стек при вызове и после call ставит add esp,..