Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить имя принтера [D6, WinXP]


ZHK ©   (2004-04-30 09:56:00) 

Заранее прошу прощения, если я испльзую неверную терминологию, но пусть простят меня глаза искушенного WINAPI-ста. Как у любого устройства в Винде, у принтера существует два идентификатора - название (например, "Основной принтер") и имя, например \\server\hp-1170. Господа, подскажите, как получить имя, в том числе и сетевое. Насколько я понял, если вызвать функцию:

GetPrinter(PrinterHandle,2,@PRINTER_INFO_2,SizeOf(PRINTER_INFO_2),Need),

то в PRINTER_INFO_2.pShareName я и получу желаемое. Причем Need, по идее, должно тоже равняться SizeOf(PRINTER_INFO_2). Если это все правильно, то осталось получить хендл активного принтера, что я, похоже, сделать пока не могу. Может кто умеет? Буду надеяться на помощь!


ZHK   (2004-04-30 12:58:00) [1]

А вот такой вариант функции работает интереснее. По-крайней мере и меня получилось то, что я задумал:


Function GetDefaultPrinterNameA(APrinterName:String): String;
var
epNeeded:     Cardinal;
epReturn:     Cardinal;
epP, epTmp:   PByte;
epCounter:    integer;
begin
result:='';
EnumPrinters(PRINTER_ENUM_LOCAL or PRINTER_ENUM_CONNECTIONS, nil, 2, nil, 0, epNeeded, epReturn);
GetMem(epP, epNeeded);
epTmp:=epP;
try
EnumPrinters(PRINTER_ENUM_LOCAL or PRINTER_ENUM_CONNECTIONS, nil, 2, epP, epNeeded, epNeeded, epReturn);
For epCounter:=0 to epReturn-1 do
begin
if (PPrinterInfo2(epTmp)^.pPrinterName<>nil) and (APrinterName=PPrinterInfo2(epTmp)^.pPrinterName) then
     result:=PPrinterInfo2(epTmp)^.pServerName+'\'+PPrinterInfo2(epTmp)^.pShareName;
inc(epTmp, sizeof(TPrinterInfo2));
end;
finally FreeMem(epP, epNeeded); end;
end;


Правда, если вызвать ее следующим образом:


ShowMessage(GetDefaultPrinterA(Printer.Printers[Printer.PrinterIndex]))


Спасибо бармаглоту! :-)


ZHK   (2004-04-30 11:34:00) [2]

К сожалению эта функция выдает имя в формате "Основной принтер", то есть то, что я могу получить не напрягаясь, используя

Printer.Printers[Prunter.PrinterIndex]...

А мне необходимо другое имя. Ну, например, которое можно подставить в команду COPY.


[lamer]Barmaglot   (2004-04-30 10:02:00) [3]


Function GetDefaultPrinterNameA: String;
var
 epNeeded:     Cardinal;
 epReturn:     Cardinal;
 epP, epTmp:   PByte;
 epCounter:    integer;
begin
result:='';
EnumPrinters(PRINTER_ENUM_LOCAL or PRINTER_ENUM_CONNECTIONS, nil, 5, nil, 0, epNeeded, epReturn); //для NT заменить 5 на 4
GetMem(epP, epNeeded);
epTmp:=epP;
try
 EnumPrinters(PRINTER_ENUM_LOCAL or PRINTER_ENUM_CONNECTIONS, nil, 5, epP, epNeeded, epNeeded, epReturn);
 For epCounter:=0 to epReturn-1 do
 begin
 if ((PPrinterInfo5(epTmp)^.Attributes and PRINTER_ATTRIBUTE_DEFAULT)<>0) then
       result:=PPrinterInfo5(epTmp)^.pPrinterName;
 inc(epTmp, sizeof(TPrinterInfo5));
 end;
finally FreeMem(epP, epNeeded); end;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо