EnumPrinters

Тема в разделе "WASM.WIN32", создана пользователем pas, 12 дек 2004.

  1. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    Почему EnumPrinters выдаёт информацию о принтерах в следующем виде:

    (на компе установлено три принтера, приведенное ниже выдаёт моя прога, но посмотрев под Olli инфу в предоставляемый буфер EnumPrinters записывает именно в таком виде, без форматирования конечно)

    pName

    pDescription

    pComment
    Код (Text):
    1.  
    2.  
    3. WinFax
    4. WinFax,WinFax,
    5. Print to this device to send a fax.
    6. ============================================
    7. hp deskjet 845c series
    8. hp deskjet 845c series,hp deskjet 845c series,
    9.  
    10. ============================================
    11. Fax
    12. Fax,Windows NT Fax Driver,
    13.  
    14. ============================================
    15.  


    вся информация записана вперемешку, но на сколько я понял разграничение между строками нулевое слово.

    Заранее спасибо за ответы.

    Исходник:
    Код (Text):
    1.  
    2. Объявление структур:
    3.  
    4. struc PRINTER_INFO_1
    5. {
    6. .Flags         dd 0; ôëàãè
    7. .pDescription  dd 0; îïèñàíèå
    8. .pName         dd 0;  èìÿ ïðèíòåðà
    9. .pComment      dd 0; êîììåíòàðèé
    10. };PRINTER_INFO_1
    11. ;ends
    12. pi PRINTER_INFO_1
    13. pi2 PRINTER_INFO_1
    14. pi3 PRINTER_INFO_1
    15. times 1024 db 0
    16. endstr:
    17.  
    18. переменные и макросы:
    19.  
    20. err dd endstr-pi
    21. ;end section '.data'
    22. macro CountStringW buffer
    23. {
    24.   push  ecx edi
    25.   mov   edi,buffer
    26.   xor   eax,eax
    27.   ;mov al,','
    28.   mov   ecx,0xff
    29.   cld
    30.   repne scasw
    31.   sub   edi,buffer
    32.   mov   eax,edi
    33.   pop     edi ecx
    34. }
    35. ;endm
    36. macro _StringCopyW buffer,CopyString
    37. {
    38.   push       ecx edi esi
    39.   CountStringW CopyString
    40.   mov      ecx,eax
    41.   mov      esi,CopyString
    42.   mov      edi,buffer
    43.   cld
    44.   rep movsw
    45.   pop      esi edi ecx
    46. }
    47. ;endm
    48. вызов EnumPrinters:
    49.          invoke  EnumPrinters,PRINTER_ENUM_LOCAL,0,1,pi,[err],err,ColStr
    50. формирование строки для первого принтера
    51.          mov     ebx,buf
    52.          _StringCopyW ebx,[pi.pName]; копируем pName
    53.          CountStringW [pi.pName]
    54.          add      ebx,eax
    55.          dec      ebx
    56.          dec      ebx
    57.          mov      eax,0A000Dh
    58.          mov      [ebx],eax
    59.          add     ebx,4
    60.          _StringCopyW ebx,[pi.pDescription]; копируем pDescription
    61.          CountStringW [pi.pDescription]
    62.          add      ebx,eax
    63.          dec      ebx
    64.          dec      ebx
    65.          mov      eax,0A000Dh
    66.          mov      [ebx],eax
    67.          add     ebx,4
    68.          _StringCopyW ebx,[pi.pComment]; копируем pComment
    69.          CountStringW [pi.pComment]
    70.          add      ebx,eax
    71.          dec      ebx
    72.          dec      ebx
    73.          mov      eax,0A000Dh
    74.          mov      [ebx],eax
    75.          add     ebx,4
    76.          _StringCopyW ebx,line; разделяющая строка
    77.          CountStringW line
    78.          add      ebx,eax
    79.          stdcall   IntToString,f,eax
    80.          invoke MessageBox,0,f,f,MB_OK
    81.          dec      ebx
    82.          dec      ebx
    83.          mov      eax,0A000Dh
    84.          mov      [ebx],eax
    85.          add     ebx,4
    86.  
    87.  


    Далее аналогично для оставшихся двух принтеров.
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    pas

    В чем вопрос?

    Как правильно использовать EnumPrinters?
     
  3. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    Вобщем то правильно ли я понимаю, что в юникоде строки разделяются двойными нулями? Ведь в свойствах принтера просматриваемых из проводника повторяющихся строк типа:

    WinFax,WinFax,

    нет.
     
  4. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    pas

    Завершающий нуль-символ полноправный член строки и имеет такой же размер, как и остальные элементы строки, т.е. в случае unicode - два байта.



    в свойствах принтера просматриваемых из проводника повторяющихся строк ... нет

    Обрати внимание на описание PRINTER_INFO_1.pDescription. Там есть указание, что для w9x (у меня под w2ksp4 тоже) он содержит разделенные запятыми значения PRINTER_INFO_2.pPrinterName, PRINTER_INFO_2.pDriverName и PRINTER_INFO_2.pComment.



    Про код.



    EnumPrinters принято вызывать два раза. Первый раз для определения размера буфера, второй для получения информации.



    Зачем выдумывать CountStringW и _StringCopyW если есть lstrlenW и lstrcatW?
     
  5. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    Спасибо за разъяснение.