F fshyz Unregistered / Unconfirmed GUEST, unregistred user! 2002-05-07 #1 使用函数Getprinter(pprt,2,pinfo,SizeOf(pinfo),b)时错误“传递到系统调用的数据区太小。”,是不是我的语句错误,或者有没有其他更好的方法。 我用的是Delphi 6.0+Win2k高级服务器版。
使用函数Getprinter(pprt,2,pinfo,SizeOf(pinfo),b)时错误“传递到系统调用的数据区太小。”,是不是我的语句错误,或者有没有其他更好的方法。 我用的是Delphi 6.0+Win2k高级服务器版。
P Pipi. Unregistered / Unconfirmed GUEST, unregistred user! 2002-05-07 #2 相关的不对 var info:TPrinterInfo2; bWORD; Getprinter(pprt,2,@info,SizeOf(info),@b)
F fshyz Unregistered / Unconfirmed GUEST, unregistred user! 2002-05-07 #3 不行啊!! 而且当执行到freemem(b)时更出现了访问无效地址的错误 所有的程序如下:(这是我在大富翁里找到的程序) var pinfo: pPRINTERINFO2; pprt,a: Cardinal; bDWORD; 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(b)时更出现了访问无效地址的错误 所有的程序如下:(这是我在大富翁里找到的程序) var pinfo: pPRINTERINFO2; pprt,a: Cardinal; bDWORD; 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;
F fshyz Unregistered / Unconfirmed GUEST, unregistred user! 2002-05-07 #6 还是提示同样的错误。程序如下: var pinfo: TPrinterInfo2; pprt,a: Cardinal; bDWORD; 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;
还是提示同样的错误。程序如下: var pinfo: TPrinterInfo2; pprt,a: Cardinal; bDWORD; 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;
P Pipi. Unregistered / Unconfirmed GUEST, unregistred user! 2002-05-07 #7 b是DWORD,返回需要的字节数 另外我在我自己的机器上运行了一下,发现需要1244个字节的buf,你还是用回你原先的, 但是申请更大的内存
F fshyz Unregistered / Unconfirmed GUEST, unregistred user! 2002-05-07 #8 程序如下: var pinfo: pPRINTERINFO2; pprt,a: Cardinal; bDWORD; 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; 但还是一样的错误!!救救我啊!!! 我还想知道你如何知道需要多少空间的!!
程序如下: var pinfo: pPRINTERINFO2; pprt,a: Cardinal; bDWORD; 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; 但还是一样的错误!!救救我啊!!! 我还想知道你如何知道需要多少空间的!!
P Pipi. Unregistered / Unconfirmed GUEST, unregistred user! 2002-05-07 #9 SizeOf(pinfo) 不对,这个size是指针的size,只有4 你申请了3000,就直接写3000。
P Pipi. Unregistered / Unconfirmed GUEST, unregistred user! 2002-05-07 #10 另外b只需要一个dword,就是 b:=allocmem(sizeof(DWORD)); 就可以了,他不必3000这么大 如果真的太小,那么 b^ (注意 ^ 号)就是需要的size
F fshyz Unregistered / Unconfirmed GUEST, unregistred user! 2002-05-07 #11 不好意思,我好像提错问题,我需要暂停打印机,现在是查询打印机状态。 我改成以下程序: var pinfo: pPRINTERINFO2; pprt,a: Cardinal; bDWORD; 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; 出现错误:“拒绝访问。”
不好意思,我好像提错问题,我需要暂停打印机,现在是查询打印机状态。 我改成以下程序: var pinfo: pPRINTERINFO2; pprt,a: Cardinal; bDWORD; 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; 出现错误:“拒绝访问。”