Форум: "WinAPI";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
ВнизКак получить имя принтера Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.038 c