プリンターでジョブをリストしようとしています。enumjobs を初めて呼び出して、2 回目の呼び出しでパラメーターとして渡す必要があるバッファーのサイズを取得しようとしました (Microsoft のドキュメントで推奨されているように)。 enumjobs API。
私は間違っていますか?!
procedure showLastError();
var
pErrorText:pchar;
lastError:integer;
begin
lastError := GetLastError();
pErrorText := nil;
if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_ALLOCATE_BUFFER
,nil,lastError,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),@pErrorText,0,nil)<> 0) then
begin
showmessage(pErrorText);
end;
end;
procedure TForm3.Button1Click(Sender: TObject);
var
handlePrinter:NativeUInt;
pJob:pointer;
sizePJob:integer;
pcbNeeded:cardinal;
pcReturned:cardinal;
cByteNeeded,cByteUsed:cardinal;
i:integer;
pJobInfo: PJobInfo1;
temp:integer;
ret:boolean;
pPrinterInfo:PPrinterInfo2W;
PPRINTER_INFO_1 : PRINTER_INFO_1;
begin
handlePrinter := 0;
if not OpenPrinter(nil,handlePrinter,nil) then
begin
showLastError();
exit;
end;
if not GetPrinter(handlePrinter,3,nil,0,@cByteNeeded)then
begin
if (GetLastError() <> ERROR_INSUFFICIENT_BUFFER) then
begin
showLastError();
exit;
end;
end;
pPrinterInfo := allocMem( cByteNeeded);
if not GetPrinter(handlePrinter,3,pPrinterInfo,cByteNeeded,@cByteUsed)then
begin
if (GetLastError() <> ERROR_INSUFFICIENT_BUFFER) then
begin
showLastError();
FreeMem(pPrinterInfo);
exit;
end;
end;
ret := EnumJobs(handlePrinter,0,pPrinterInfo.cJobs,2,nil,0,&pcbNeeded,&pcReturned);
if (not ret)then
begin
if (GetLastError() <> ERROR_INSUFFICIENT_BUFFER) then
begin
showLastError();
FreeMem(pPrinterInfo);
exit;
end;
end;
FreeMem(pPrinterInfo);
end;