Sie IST beantwortet.
@Mackhack: Die Prozedur war noch nicht fertig. Wenn du, wie Christian
hApp durch null ersetzte, siehst du immer eine Messagebox mit dem gefundenen Drucker. Hier der fertige Code:
Delphi-Quellcode:
TPrinterCallback = function(Printername: string): Boolean; stdcall;
// ...
// ...
// ...
function PrinterCallback(PrinterName: string): Boolean; stdcall;
begin
SendDlgItemMessage(hApp, IDC_CB_PRINTERS, CB_ADDSTRING, 0, Integer(@Printername[1]));
result := True;
end;
procedure GetPrinters(Callback: TPrinterCallback);
var
dwNeeded : DWORD;
dwReturn : DWORD;
pinfo4 : PPrinterInfo4;
pWork : PPrinterInfo4;
i : Integer;
s : string;
begin
dwNeeded := 0;
dwReturn := 0;
EnumPrinters(PRINTER_ENUM_LOCAL, nil, 4, nil, 0, dwNeeded, dwReturn);
GetMem(pinfo4, dwNeeded);
try
if EnumPrinters(PRINTER_ENUM_LOCAL, nil, 4, pinfo4, dwNeeded, dwNeeded, dwReturn) then
begin
pWork := pinfo4;
for i := 0 to dwReturn - 1 do
begin
s := string(pWork.pPrinterName);
if not Callback(s) then
break;
Inc(pWork);
end;
end
else
MessageBox(hApp, PChar(SysErrorMessage(GetLastError)), '', 0);
finally
FreeMem(pinfo4);
end;
end;
Da ich das ganze ohne
VCL läuft, ich daher keine StringListen zur Verfügung habe und ich auch das ganze nicht in eine Klasse gekapselt habe und somit keine Ereignisse habe, nutze ich die Funktionalität einer Callback Funktion. Du musst also entsprechend die Callback Funktion anpassen, wenn du es so nutzen willst. Ich würde es aber so umschreiben, dass entweder eine Stringliste mit den Druckern zurückgegeben wird oder aber es in eine Klasse kapseln und bei jedem Drucker ein Ereigniss auslösen oder so.