Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

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

EnumPrinters schlägt fehl

  Alt 5. Jun 2006, 23:43
Ich versuche so alle lokalen Drucker zu bekommen:
Delphi-Quellcode:
procedure GetPrinters;
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, PByte(pinfo4), sizeof(pinfo4), dwNeeded, dwReturn) then
    begin
      pWork := pinfo4;
      for i := 0 to dwReturn - 1 do
      begin
        s := string(pWork.pPrinterName);
        MessageBox(hApp, PChar(s), '', 0);
        Inc(pWork, sizeof(pWork));
      end;
    end
    else
      MessageBox(hApp, PChar(SysErrorMessage(GetLastError)), '', 0);
  finally
    FreeMem(pinfo4);
  end;
end;
Aber leider schlägt EnumPrinters mit der Fehlermeldung:
Zitat:
Der an einen Systemaufruf übergebene Datenbereich ist zu klein
fehl. Was ich irgendwie nicht so ganz verstehe.

Anstatt sizeof(pinfo4) muss es natürlich dwNeeded heißen:
Delphi-Quellcode:
procedure GetPrinters;
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);
        MessageBox(hApp, PChar(s), '', 0);
        Inc(pWork);
      end;
    end
    else
      MessageBox(hApp, PChar(SysErrorMessage(GetLastError)), '', 0);
  finally
    FreeMem(pinfo4);
  end;
end;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat