Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

Как получить имя принтера   Найти похожие ветки 

 
ZHK ©   (2004-04-30 09:56) [0]

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

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

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


 
[lamer]Barmaglot ©   (2004-04-30 10:02) [1]


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;


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

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

Printer.Printers[Prunter.PrinterIndex]...

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


 
ZHK ©   (2004-04-30 12:58) [3]

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


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]))


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



Страницы: 1 вся ветка

Текущий архив: 2004.06.06;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.041 c
4-1083207979
Yus
2004-04-29 07:06
2004.06.06
Нажатие кнопки (API)


4-1082863580
_Sh_
2004-04-25 07:26
2004.06.06
Проблема с GetFileSize


1-1085354446
Denich
2004-05-24 03:20
2004.06.06
Формула по random


4-1082128654
WELLiON
2004-04-16 19:17
2004.06.06
меню в трее


1-1085226058
Talle
2004-05-22 15:40
2004.06.06
Использовать процедуры из Dll, написанного на С builder6?