Почему EnumPrinters выдаёт информацию о принтерах в следующем виде: (на компе установлено три принтера, приведенное ниже выдаёт моя прога, но посмотрев под Olli инфу в предоставляемый буфер EnumPrinters записывает именно в таком виде, без форматирования конечно) pName pDescription pComment Код (Text): WinFax WinFax,WinFax, Print to this device to send a fax. ============================================ hp deskjet 845c series hp deskjet 845c series,hp deskjet 845c series, ============================================ Fax Fax,Windows NT Fax Driver, ============================================ вся информация записана вперемешку, но на сколько я понял разграничение между строками нулевое слово. Заранее спасибо за ответы. Исходник: Код (Text): Объявление структур: struc PRINTER_INFO_1 { .Flags dd 0; ôëàãè .pDescription dd 0; îïèñàíèå .pName dd 0; èìÿ ïðèíòåðà .pComment dd 0; êîììåíòàðèé };PRINTER_INFO_1 ;ends pi PRINTER_INFO_1 pi2 PRINTER_INFO_1 pi3 PRINTER_INFO_1 times 1024 db 0 endstr: переменные и макросы: err dd endstr-pi ;end section '.data' macro CountStringW buffer { push ecx edi mov edi,buffer xor eax,eax ;mov al,',' mov ecx,0xff cld repne scasw sub edi,buffer mov eax,edi pop edi ecx } ;endm macro _StringCopyW buffer,CopyString { push ecx edi esi CountStringW CopyString mov ecx,eax mov esi,CopyString mov edi,buffer cld rep movsw pop esi edi ecx } ;endm вызов EnumPrinters: invoke EnumPrinters,PRINTER_ENUM_LOCAL,0,1,pi,[err],err,ColStr формирование строки для первого принтера mov ebx,buf _StringCopyW ebx,[pi.pName]; копируем pName CountStringW [pi.pName] add ebx,eax dec ebx dec ebx mov eax,0A000Dh mov [ebx],eax add ebx,4 _StringCopyW ebx,[pi.pDescription]; копируем pDescription CountStringW [pi.pDescription] add ebx,eax dec ebx dec ebx mov eax,0A000Dh mov [ebx],eax add ebx,4 _StringCopyW ebx,[pi.pComment]; копируем pComment CountStringW [pi.pComment] add ebx,eax dec ebx dec ebx mov eax,0A000Dh mov [ebx],eax add ebx,4 _StringCopyW ebx,line; разделяющая строка CountStringW line add ebx,eax stdcall IntToString,f,eax invoke MessageBox,0,f,f,MB_OK dec ebx dec ebx mov eax,0A000Dh mov [ebx],eax add ebx,4 Далее аналогично для оставшихся двух принтеров.
Вобщем то правильно ли я понимаю, что в юникоде строки разделяются двойными нулями? Ведь в свойствах принтера просматриваемых из проводника повторяющихся строк типа: WinFax,WinFax, нет.
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?