在delphi内如何暂停打印机??(50分)

  • 主题发起人 主题发起人 fshyz
  • 开始时间 开始时间
F

fshyz

Unregistered / Unconfirmed
GUEST, unregistred user!
使用函数Getprinter(pprt,2,pinfo,SizeOf(pinfo),b)时错误“传递到系统调用的数据区太小。”,是不是我的语句错误,或者有没有其他更好的方法。
我用的是Delphi 6.0+Win2k高级服务器版。
 
相关的不对
var
info:TPrinterInfo2;
b:DWORD;
Getprinter(pprt,2,@info,SizeOf(info),@b)
 
不行啊!!
而且当执行到freemem(b)时更出现了访问无效地址的错误
所有的程序如下:(这是我在大富翁里找到的程序)
var
pinfo: pPRINTERINFO2;
pprt,a: Cardinal;
b:PDWORD;
Str:String;
begin

b:=allocmem(256);
pinfo:=AllocMem(1000);
if OpenPrinter(PChar(Printer.Printers[Printer.printerIndex]),pprt,nil) then

begin

a:=1000;
if getprinter(pprt,2,@pinfo,SizeOf(pinfo),@b) then

showmessage(pinfo.pPrinterName+' ststus:'+inttostr(pinfo.Status))
else

begin

str:=SysErrorMessage(GetLastError);
showmessage(Str);
end;

ClosePrinter(pprt);
end;


freemem(b);
freemem(pinfo);
end;

 
用我的方法,两个freemem都是要去掉的
 
我的是局部变量,不用申请内存,也不用freemem的
 
还是提示同样的错误。程序如下:
var
pinfo: TPrinterInfo2;
pprt,a: Cardinal;
b:PDWORD;
Str:String;
begin

if OpenPrinter(PChar(Printer.Printers[Printer.printerIndex]),pprt,nil) then

begin

a:=1000;
if getprinter(pprt,2,@pinfo,SizeOf(pinfo),@b) then

showmessage(pinfo.pPrinterName+' ststus:'+inttostr(pinfo.Status))
else

begin

str:=SysErrorMessage(GetLastError);
showmessage(Str);
end;

ClosePrinter(pprt);
end;

end;


 
b是DWORD,返回需要的字节数
另外我在我自己的机器上运行了一下,发现需要1244个字节的buf,你还是用回你原先的,
但是申请更大的内存
 
程序如下:
var
pinfo: pPRINTERINFO2;
pprt,a: Cardinal;
b:PDWORD;
Str:String;
begin

b:=allocmem(3000);
pinfo:=AllocMem(3000);
if OpenPrinter(PChar(Printer.Printers[Printer.printerIndex]),pprt,nil) then

begin

a:=1000;
if getprinter(pprt,2,pinfo,SizeOf(pinfo),b) then

showmessage(pinfo.pPrinterName+' ststus:'+inttostr(pinfo.Status))
else

begin

str:=SysErrorMessage(GetLastError);
showmessage(Str);
end;

ClosePrinter(pprt);
end;


freemem(b);
freemem(pinfo);
end;

但还是一样的错误!!救救我啊!!!
我还想知道你如何知道需要多少空间的!!
 
SizeOf(pinfo) 不对,这个size是指针的size,只有4
你申请了3000,就直接写3000。
 
另外b只需要一个dword,就是 b:=allocmem(sizeof(DWORD));
就可以了,他不必3000这么大
如果真的太小,那么 b^ (注意 ^ 号)就是需要的size
 
不好意思,我好像提错问题,我需要暂停打印机,现在是查询打印机状态。
我改成以下程序:
var
pinfo: pPRINTERINFO2;
pprt,a: Cardinal;
b:PDWORD;
Str:String;
begin

b:=allocmem(3000);
pinfo:=AllocMem(3000);
if OpenPrinter('Panasonic KX-P6500',pprt,nil) then

begin

a:=1000;
If Not SetPrinter(pprt,0,NIL,PRINTER_CONTROL_PAUSE) then

begin

str:=SysErrorMessage(GetLastError);
showmessage(Str);
end;

ClosePrinter(pprt);
end;


freemem(b);
freemem(pinfo);
end;

出现错误:“拒绝访问。”
 
接受答案了.
 
后退
顶部