OutputDebugString -> printf

Тема в разделе "LANGS.C", создана пользователем cresta, 16 июн 2007.

  1. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Как можно добавить произвольное количество параметров для OutputDebugString, которая принимает только один параметр, и превратить её в аналог printf ?

    Т.е. примерно так:
    Код (Text):
    1.     void PRINT (char* fmt, ...){
    2.         char buffer[1024];
    3.  
    4.         wsprintf (buffer, fmt, ...);
    5.         OutputDebugString (buffer);
    6.     }
    Здесь, естественно, ошибка (...)

    Пробовал с va_list - тоже не получается :dntknw:
    Что можно придумать?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    wvsprintf, третий параметр - va_list, подробнее в мсдне.
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Я ж говорю, что уже пробовал пробовал это:

    Код (Text):
    1.     void PRINT (char* fmt, va_list arglist){
    2.         char buffer[1024];
    3.         wvsprintf (buffer, fmt, arglist);
    4.         OutputDebugString (buffer);
    5.     }
    6.  
    7.     PRINT ("Node = %s\n", pNode->next->pBuffer);
    Компилятор выдаёт ошибку: 'PRINT' : function does not take 2 arguments.

    Или что, я сам должен инициализировать va_list?
    Если да, то это получается слишком громоздкий код...
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. VOID PrintFormatMessage(PSTR Format, ...){
    2.     char tmp[1000];
    3.     va_list cur;
    4.  
    5.     va_start(cur, Format);
    6.     wvsprintf(tmp, Format, cur);
    7.     OutputDebugString(hWnd, tmp);
    8. }
    просто жуть как громоздко.
     
  5. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    ну я ж не знал про va_start :)
    думал самому придется заполнять.
    Спасибо.
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    я делал так
    Код (Text):
    1. int __cdecl message(const char *format, ...)
    2. {
    3.     va_list arglist;
    4.  
    5.     va_start(arglist, format);
    6.     int retval = vmessage(format, arglist);
    7.     va_end(arglist);
    8.     return retval;
    9. }
    10.  
    11. int __cdecl vmessage(const char *format, va_list arglist)
    12. {
    13.     char buffer[MAX_FILENAME];
    14.  
    15.     buffer[0] = '\0';
    16.     int retval = _vsnprintf(buffer, sizeof(buffer), format, arglist);
    17.     Addtolist(0, 0, buffer);
    18.     return retval;
    19. }
     
  7. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    va_end нафиг не надо ;) ты же arglist потом юзать не собираешься, да и зачем на 2 функции разбивать, ведь ты же vmessage не юзаешь в коде?
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    код подсмотрел в сорцах CRT :)

    юзаю ;)

    ЗЫ: код написан для плагина Embedded Perl для Olly