Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: EnumPrinters schlägt fehl

  Alt 6. Jun 2006, 16:08
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat