| t-hex | 26.07.2005 - 12:26:12 |
| Merhaba,
Delphi'de Printer.Printers ile yazıcı listesini alıyorum ama bu listedki öğeler sistemde yüklü olan yazıcıların isimleri DATABANK üzerinde otomatik Oki ML 521 Elite (IBM) hp deskjet 845c series oysa ben bu yazıcıların Bağlantı Noktalarının bilgisini almak istiyorum. Mesela "DATABANK üzerinde otomatik Oki ML 521 Elite (IBM)" isimli yazıcının bağlantı noktası aslında "\\DATABANK\OkiML521". Bu bilgiyi nasıl alabilirim? | |
| t-hex | 28.07.2005 - 13:21:47 |
| Sormadan önce forumda ve internette aradım ama işime yarayacak bir bilgiye ulaşamadım. Soruyu biraz daha açayım.
Windowsta Yazıcılar ve Fakslar listesinde mevcut yazıcıların isimleri var. Bu isimlere delphi'de kod ile ulaşabililiyorum ama bu yazıların özelliklerini açtığımda Bağlantı noktaları sekmesinde Bu yazıcının hangi hangi bağlantı noktasını kullandığı görülüyor. Mesela yerel yazıcıysa LPT1 yazıyor, ağ üzerinde tanıtılmışsa \\DATABANK\OkiML521 gibi... Ben bu bağlantı noktası bilgisini kod ile alabilmek istiyorum çünkü nokta vuruşlu yazıcılara direk bilgi göndermem gerekiyor. Teşekkürler. | |
| name | 30.07.2005 - 00:11:45 |
| Merhaba
FastReport'un frxPrinter unit'inde "FillPrinters" diye bir procedure var. Bu procedure bazı windows api function'larını çağırarak işlem yapıyo. Ancak sizin istediğiniz port ismini WinNt tabanlı sistemlerde almıyor. Procedure'un içersinde "pPortName" isimli bir değişken var. Bu kelimeyi "tamaracka.com" da arattım ve ilk sayfada port ismini veren bir makale buldum. function GetPrinterPort(PrinterName : String) : shortstring; var dwNeeded : DWORD; hGlobal : cardinal; bFlag : BOOLEAN; hPrinter : THandle; pd : _PRINTER_DEFAULTS; pi2 : ^_PRINTER_INFO_2; pPrinterName : Pchar; level : integer; begin level := 2; result := ''; bFlag := true; pi2 := nil; pPrinterName := ''; hGlobal := 0; try GetMem(pPrinterName,length(PrinterName)+1); StrPCopy(pPrinterName,PrinterName); // find printer handle og åben printer zeromemory(@pd,sizeof(pd)); pd.DesiredAccess := PRINTER_ACCESS_USE; bFlag := OpenPrinter(pPrinterName, hPrinter, @pd); if ((not bFlag) or (hPrinter = 0)) then exit; // først finder vi størrelse på buffer GetPrinter(hPrinter, Level, nil, 0, @dwNeeded); if (dwNeeded = 0) then exit; // allocate memory til buffer hGlobal := GlobalAlloc(GHND, dwneeded); pi2 := GlobalLock(hGlobal); if (pi2 = nil) then exit; // nu henter vi data fra printer bFlag := GetPrinter(hPrinter, Level, pi2, dwNeeded, @dwNeeded); if (not bFlag) then exit; result := StrPas(pi2.pPortName); finally if (pi2 <> nil) then GlobalUnlock(hGlobal); if (hGlobal <> 0) then GlobalFree(hGlobal); if (pPrinterName <> nil) then freeMem(pPrinterName); if (hPrinter <> 0) then closeprinter(hPrinter); //if (not bFlag) then GetLastSystemError('GetPrinterPort '+printername); end; end; | |
| name | 30.07.2005 - 00:36:38 |
| Aslında belirttiğim yazı makale değil borlan'ın delphi haber grubuna gönderilmiş cevabı alınmış bir soru. Cevapta verilmiş olan unit'i aynen aktarıyorum. Çok işe yarayabilecek kodlar var içersinde.
unit uPrinterStuff; interface uses SysUtils, Windows, Messages, Classes, Graphics, comctrls, winspool, dialogs; procedure SetPrinterStatus(PrinterName: string; psStatus: dword); procedure ModifyPrinterPort(PrinterName, PortName: string); procedure GetAPIPortListToView(var PortLV: TListView); procedure GetAPIPortListToList(var PortList: TStringList); function PrinterExists(PrinterName: string): boolean; function GetPrinterPort(PrinterName: string): shortstring; procedure ListJobsForprinter(PrinterName: string; var JobLV: TListView); function JobsInPrinterQueue(PrinterName: string): integer; function GetHandleForPrinter(PrinterName: string): THandle; procedure GetPrinterListToList(var PrinterList: TStringList); implementation function GetHandleForPrinter(PrinterName: string): THandle; // find printer handle og åben printer var bFlag: BOOLEAN; hPrinter: THandle; pd: _PRINTER_DEFAULTS; begin bFlag := false; hPrinter := 0; result := 0; try if PrinterName = '' then exit; zeromemory(@pd, sizeof(pd)); pd.DesiredAccess := PRINTER_WRITE; bFlag := OpenPrinter(pChar(PrinterName), hPrinter, @pd); if ((not bFlag) or (hPrinter = 0)) then exit; result := hPrinter; finally end; end; function PrinterExists(PrinterName: string): boolean; var hPrinter: THandle; begin result := false; hPrinter := 0; try hPrinter := GetHandleForPrinter(PrinterName); if hPrinter = 0 then exit; result := true; finally if (hPrinter <> 0) then closeprinter(hPrinter); end; end; procedure SetPrinterStatus(PrinterName: string; psStatus: dword); var pd: _PRINTER_DEFAULTS; hPrinter: THandle; level: DWORD; bFlag: BOOLEAN; dwCommand: dword; pPrinter: dword; begin level := 0; hPrinter := 0; bFlag := false; dwCommand := 0; pPrinter := 0; try zeromemory(@pd, sizeof(pd)); pd.DesiredAccess := PRINTER_ALL_ACCESS; bFlag := OpenPrinter(PChar(PrinterName), hPrinter, @pd); if ((not bFlag) or (hPrinter = 0)) then exit; dwCommand := psStatus; pPrinter := PRINTER_CONTROL_SET_STATUS; bFlag := SetPrinter(hPrinter, Level, @pPrinter, dwCommand); finally //if (not bFlag) then GetLastSystemError('Setprinter '+printername); if (hPrinter <> 0) then closeprinter(hPrinter); end; end; procedure ModifyPrinterPort(PrinterName, PortName: string); var pd: _PRINTER_DEFAULTS; pi2: ^_PRINTER_INFO_2; hGlobal: cardinal; hPrinter: THandle; level: DWORD; dwNeeded: DWORD; bFlag: BOOLEAN; begin level := 2; hPrinter := 0; pi2 := nil; hGlobal := 0; dwneeded := 0; bFlag := false; zeromemory(@pd, sizeof(pd)); try pd.DesiredAccess := PRINTER_ALL_ACCESS; bFlag := OpenPrinter(Pchar(PrinterName), hPrinter, @pd); if ((not bFlag) or (hPrinter = 0)) then exit; // først finder vi størrelse på buffer GetPrinter(hPrinter, Level, nil, 0, @dwNeeded); if (dwNeeded = 0) then exit; // allocate memory til buffer hGlobal := GlobalAlloc(GHND, dwneeded); pi2 := GlobalLock(hGlobal); if (pi2 = nil) then exit; // nu henter vi data fra printer bFlag := GetPrinter(hPrinter, Level, pi2, dwNeeded, @dwNeeded); if (not bFlag) then exit; // sæt ny port og skriv det ned pi2.pPortName := PChar(PortName); pi2.pComment := PChar(PrinterName + ' Rutes ' + PortName); bFlag := SetPrinter(hPrinter, Level, pi2, 0); if (not bFlag) then exit; // notificer andre applikationer om ændringen sendmessage(HWND_BROADCAST, WM_DEVMODECHANGE, 0, longint(@pi2.pPrinterName)); finally if (pi2 <> nil) then GlobalUnlock(hGlobal); if (hPrinter <> 0) then closeprinter(hPrinter); if (hGlobal <> 0) then GlobalFree(hGlobal); //if (not bFlag) then GetLastSystemError('ModifyPrinterPort'); end; end; procedure GetAPIPortListToList(var PortList: TStringList); type TPortInfos = array[0..0] of _PORT_INFO_2; //TPortInfo - Typecasting var p: pointer; pi2: _PORT_INFO_2; hGlobal: cardinal; level: DWORD; dwNeeded, dwReturned: DWORD; bFlag: BOOLEAN; i: dword; begin level := 2; bFlag := true; p := nil; hGlobal := 0; try // først finder vi mindste størrelse på buffer EnumPorts(nil, level, p, 0, dwNeeded, dwReturned); if (dwNeeded = 0) then exit; // allocate memory til buffer hGlobal := GlobalAlloc(GHND, dwneeded); p := GlobalLock(hGlobal); if (p = nil) then exit; // her henter jeg så de ægte data bFlag := EnumPorts(nil, level, p, dwNeeded, dwNeeded, dwReturned); if (not bFlag) then exit; // Loop igennem alle portene og hent data. PortList.Clear; {$R-} with PortList do for i := 0 to dwReturned - 1 do begin Pi2 := TPortInfos(p^)[i]; Add(strpas(Pi2.pPortName)); end; {$R+} finally if (p <> nil) then GlobalUnlock(hGlobal); if (hGlobal <> 0) then GlobalFree(hGlobal); //if (not bFlag) then GetLastSystemError('GetAPIPortListToList'); end; end; procedure GetPrinterListToList(var PrinterList: TStringList); type TPrinterInfos = array[0..0] of _PRINTER_INFO_2; //TPrinterInfo -Typecasting var p: pointer; pi: _PRINTER_INFO_2; hGlobal: cardinal; level: DWORD; dwNeeded, dwReturned: DWORD; bFlag: BOOLEAN; i: dword; begin level := 2; bFlag := true; p := nil; hGlobal := 0; try try // først finder vi mindste størrelse på buffer EnumPrinters(PRINTER_ENUM_LOCAL, nil, level, p, 0, dwNeeded, dwReturned); if (dwNeeded = 0) then exit; // allocate memory til buffer hGlobal := GlobalAlloc(GHND, dwneeded); p := GlobalLock(hGlobal); if (p = nil) then exit; // her henter jeg så de ægte data bFlag := EnumPrinters(PRINTER_ENUM_LOCAL, nil, level, p, dwneeded, dwNeeded, dwReturned); if (not bFlag) then exit; // Loop igennem alle portene og hent data. Printerlist.Clear; {$R-} with Printerlist do for i := 0 to dwReturned - 1 do begin Pi := TPrinterInfos(p^)[i]; add(pi.pPrinterName); end; {$R+} except end; finally if (p <> nil) then GlobalUnlock(hGlobal); if (hGlobal <> 0) then GlobalFree(hGlobal); //if (not bFlag) then GetLastSystemError('GetPrinterListToList'); end; end; procedure GetAPIPortListToView(var PortLV: TListView); type TPortInfos = array[0..0] of _PORT_INFO_2; //TPortInfo - Typecasting var p: pointer; pi2: _PORT_INFO_2; hGlobal: cardinal; level: DWORD; dwNeeded, dwReturned: DWORD; bFlag: BOOLEAN; i: dword; ListItem: TListItem; begin level := 2; bFlag := true; p := nil; hGlobal := 0; try // først finder vi mindste størrelse på buffer EnumPorts(nil, level, p, 0, dwNeeded, dwReturned); if (dwNeeded = 0) then exit; // allocate memory til buffer hGlobal := GlobalAlloc(GHND, dwneeded); p := GlobalLock(hGlobal); if (p = nil) then exit; // her henter jeg så de ægte data bFlag := EnumPorts(nil, level, p, dwNeeded, dwNeeded, dwReturned); if (not bFlag) then exit; // Loop igennem alle portene og hent data. PortLV.Items.Clear; {$R-} with PortLV do for i := 0 to dwReturned - 1 do begin Pi2 := TPortInfos(p^)[i]; ListItem := Items.add; ListItem.Caption := strpas(Pi2.pPortName); ListItem.subitems.add(strpas(Pi2.pMonitorName)); ListItem.subitems.add(strpas(Pi2.pDescription)); case Pi2.fPortType of PORT_TYPE_WRITE: ListItem.subitems.add(strpas('PORT_TYPE_WRITE')); PORT_TYPE_READ: ListItem.subitems.add(strpas('PORT_TYPE_READ')); PORT_TYPE_REDIRECTED: ListItem.subitems.add(strpas('PORT_TYPE_REDIRECTED')); PORT_TYPE_NET_ATTACHED: ListItem.subitems.add(strpas('PORT_TYPE_NET_ATTACHED')); else ListItem.subitems.add(strpas('PORT_TYPE_UKENDT')); end; end; {$R+} finally if (p <> nil) then GlobalUnlock(hGlobal); if (hGlobal <> 0) then GlobalFree(hGlobal); //if (not bFlag) then GetLastSystemError('GetAPIPortListToView'); end; end; function JobsInPrinterQueue(PrinterName: string): integer; var p: pointer; level: DWORD; dwNeeded1, dwNeeded2, dwReturned: DWORD; bFlag: BOOLEAN; hPrinter: THandle; begin result := 0; p := nil; level := 1; bFlag := true; hPrinter := 0; try hPrinter := GetHandleForPrinter(PrinterName); if hPrinter = 0 then exit; // først finder vi størrelsen på bufferen dwneeded1 := 0; dwneeded2 := 0; dwreturned := 0; EnumJobs(hPrinter, 0, $FFFFFFFF, level, nil, 0, dwNeeded1, dwReturned); if (dwNeeded1 = 0) then exit; // dwneeded = 0 ~ måske ingen jobs fundet getmem(p, dwneeded1); if (p = nil) then exit; // her henter jeg så de ægte data bFlag := EnumJobs(hPrinter, 0, $FFFFFFFF, level, p, dwNeeded1, dwNeeded2, dwReturned); if dwneeded1 <> dwneeded2 then begin bFlag := true; SetLastError(0); exit; end; if (not bFlag) then exit; result := dwreturned; finally if (p <> nil) then freemem(p, dwneeded1); if (hPrinter <> 0) then closeprinter(hPrinter); //if (not bFlag) then GetLastSystemError('JobsInPrinterQueue'+printername); end; end; procedure ListJobsForprinter(PrinterName: string; var JobLV: TListView); type TJobInfo = array[0..0] of _JOB_INFO_2; // bruges til typecasting var p: pointer; ji2: _JOB_INFO_2; level: DWORD; dwNeeded, dwReturned: DWORD; bFlag: BOOLEAN; i: dword; ListItem: TListItem; hPrinter: THandle; pd: _PRINTER_DEFAULTS; begin p := nil; level := 2; bFlag := true; try JobLV.Items.Clear; // slet tidligere items fra liste // find printer handle og åben printer zeromemory(@pd, sizeof(pd)); pd.DesiredAccess := PRINTER_ACCESS_USE; bFlag := OpenPrinter(PChar(PrinterName), hPrinter, @pd); if ((not bFlag) or (hPrinter = 0)) then exit; // først finder vi størrelsen på bufferen dwneeded := 0; dwreturned := 0; EnumJobs(hPrinter, 0, $FFFFFFFF, level, nil, 0, dwNeeded, dwReturned); if (dwNeeded = 0) then exit; // dwneeded = 0 ~ måske ingen jobs fundet getmem(p, dwneeded); if (p = nil) then exit; // her henter jeg så de ægte data bFlag := EnumJobs(hPrinter, 0, $FFFFFFFF, level, p, dwNeeded, dwNeeded, dwReturned); if (not bFlag) then exit; // Loop igennem alle jobs og hent data. {$R-} with JobLV do for i := 0 to dwReturned - 1 do begin Ji2 := TJobInfo(p^)[i]; ListItem := Items.add; ListItem.Caption := inttostr(Ji2.JobID); ListItem.subitems.add(strpas(Ji2.pDocument)); ListItem.subitems.add(strpas(Ji2.pUserName)); if ji2.pStatus <> nil then ListItem.subitems.add(strpas(Ji2.pStatus)) else case Ji2.Status of JOB_STATUS_PAUSED: ListItem.subitems.add(strpas('PAUSED')); JOB_STATUS_ERROR: ListItem.subitems.add(strpas('ERROR')); JOB_STATUS_DELETING: ListItem.subitems.add(strpas('DELETING')); JOB_STATUS_SPOOLING: ListItem.subitems.add(strpas('SPOOLING')); JOB_STATUS_PRINTING: ListItem.subitems.add(strpas('PRINTING')); JOB_STATUS_OFFLINE: ListItem.subitems.add(strpas('OFFLINE')); JOB_STATUS_PAPEROUT: ListItem.subitems.add(strpas('PAPEROUT')); JOB_STATUS_PRINTED: ListItem.subitems.add(strpas('PRINTED')); end; end; {$R+} finally if (p <> nil) then freemem(p, dwneeded); if (hPrinter <> 0) then closeprinter(hPrinter); //if (not bFlag) then GetLastSystemError('ListJobsForprinter'+printername); end; end; function GetPrinterPort(PrinterName: string): shortstring; var dwNeeded: DWORD; hGlobal: cardinal; bFlag: BOOLEAN; hPrinter: THandle; pd: _PRINTER_DEFAULTS; pi2: ^_PRINTER_INFO_2; pPrinterName: Pchar; level: integer; begin level := 2; result := ''; bFlag := true; pi2 := nil; pPrinterName := ''; hGlobal := 0; try GetMem(pPrinterName, length(PrinterName) + 1); StrPCopy(pPrinterName, PrinterName); // find printer handle og åben printer zeromemory(@pd, sizeof(pd)); pd.DesiredAccess := PRINTER_ACCESS_USE; bFlag := OpenPrinter(pPrinterName, hPrinter, @pd); if ((not bFlag) or (hPrinter = 0)) then exit; // først finder vi størrelse på buffer GetPrinter(hPrinter, Level, nil, 0, @dwNeeded); if (dwNeeded = 0) then exit; // allocate memory til buffer hGlobal := GlobalAlloc(GHND, dwneeded); pi2 := GlobalLock(hGlobal); if (pi2 = nil) then exit; // nu henter vi data fra printer bFlag := GetPrinter(hPrinter, Level, pi2, dwNeeded, @dwNeeded); if (not bFlag) then exit; result := StrPas(pi2.pPortName); finally if (pi2 <> nil) then GlobalUnlock(hGlobal); if (hGlobal <> 0) then GlobalFree(hGlobal); if (pPrinterName <> nil) then freeMem(pPrinterName); if (hPrinter <> 0) then closeprinter(hPrinter); //if (not bFlag) then GetLastSystemError('GetPrinterPort ' + printername); end; end; end. | |
| t-hex | 05.08.2005 - 18:41:21 |
| Sayın @name çok teşekkürler. Bu unite işimi gördü. | |
| sadettinpolat | 05.08.2005 - 21:50:15 |
| süpermiş | |