var pcbNeeded : DWORD; PrinterInfo : PPrinterInfo2; ... // get the printer handle OpenPrinter(PChar(OldPrinterName),PrinterHandle,nil); // get the required size of the PrinterInfo structure in pcbNeeded GetPrinter(PrinterHandle,2,nil,0,@pcbNeeded); // allocate the memory PrinterInfo := AllocMem(pcbNeeded); // call GetPrinter again with pcbNeeded passed to the cbBuf parameter // if the method succeeds (and it should), PrinterInfo will contain a valid structure GetPrinter(PrinterHandle,2,PrinterInfo,pcbNeeded,@pcbNeeded); // change whatever you want PrinterInfo.pPrinterName:=PChar(NewPrinterName); // now call set printer with the revised structure SetPrinter(PrinterHandle,2,PrinterInfo2,0); FreeMem(PrinterInfo);
我自己已经解决,哎! function ChangePrinterName(sFrom, sTo: String): Boolean; var hPrinter : Thandle;//Cardinal; cbRequired : DWORD; cbBuffer : Integer; pi4 : PRINTER_INFO_4; ptr : array of Char; pd : PRINTER_DEFAULTS; begin ZeroMemory(@pd, SizeOf(pd)); pd.DesiredAccess := PRINTER_ACCESS_USE or PRINTER_ACCESS_ADMINISTER; Result := OpenPrinter(PChar(sFrom), hPrinter, @pd); if Result then begin Result := GetPrinter(hPrinter, 4, nil, 0, @cbRequired); if not Result then begin if cbRequired <> 0 then begin Result := True; SetLength(ptr, cbRequired); cbBuffer := cbRequired; Result := GetPrinter(hPrinter, 4, @ptr[0], cbBuffer, @cbRequired); if Result then begin CopyMemory(@pi4, @ptr[0], SizeOf(pi4)); pi4.pPrinterName := PChar(sTo); CopyMemory(@ptr[0], @pi4, SizeOf(pi4)); Result := SetPrinter(hPrinter, 4, @ptr[0], 0); end; end; end; ClosePrinter(hPrinter); end; end;
Windows的Win.ini文件中有下面的一些配置信息:
[Windows]
load =
run =
NullPort = None
device = HPLaserJetIII,HPPCL5MS,LPT1
更改device可能行得通
procedure TForm1.Button1Click(Sender : TObject);
var
AppName : Array [0..256] of Char; //节名称字符串
KeyName : Array [0..256] of Char; //键名称字符串
DefaultString : Array [0..256] of Char; //在键名没找到时默认返回的字串
ReturnedString : Array [0..256] of Char; //在键名找到时返回的字串
begin
AppName := 'Windows';//节名称
KeyName := 'device'; //键名称
GetProfileString(AppName,KeyName,DefaultString,ReturnedString,Sizeof(ReturnedString));
Edit1.Text := ReturnedString;//显示结果
end;
Windows系统默认的打印机信息存放于Win.INI文件中,只有修改了相应的文件内容,再通知Windows系统进行刷新,才算改变了默认的打印机。
下面是程序片断:
var
strINI : Array [0..MAX_PATH] of Char;
arrWindows : Array [0..46] of Char;
begin
GetWindowsDirectory(strINI,SizeOf(strINI));
StrCat(strINI,'Win.INI');
with TINIFile.Create(strINI) do
try //更改WIN.INI文件中的默认打印机设置
WriteString('Windows','device','HPLaserJet 4 Plus,HPPCL5MS,LPT1');
finally
Free;
end;
StrCopy(arrWindows,'Windows');
SendMessage(HWND_BROADCAST,WM_WININICHANGE,0,LongInt(@arrWindows)); //发消息
end;
vb代码可以参考一下
1) 停止 spooler 服務
2) 修改注冊表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers\printername to HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers\new printername然后修改子鍵nameHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Print\Printers\new printername\name=newprintername3) 啟動 spooler 服務
//服務操作方式:
1、采用命令行:http://technet.microsoft.com/en-us/library/cc736564(WS.10).aspx
2、采用一組API:http://msdn.microsoft.com/en-us/library/ms682108(VS.85).aspx
var
pcbNeeded : DWORD;
PrinterInfo : PPrinterInfo2;
...
// get the printer handle
OpenPrinter(PChar(OldPrinterName),PrinterHandle,nil);
// get the required size of the PrinterInfo structure in pcbNeeded
GetPrinter(PrinterHandle,2,nil,0,@pcbNeeded);
// allocate the memory
PrinterInfo := AllocMem(pcbNeeded);
// call GetPrinter again with pcbNeeded passed to the cbBuf parameter
// if the method succeeds (and it should), PrinterInfo will contain a valid structure
GetPrinter(PrinterHandle,2,PrinterInfo,pcbNeeded,@pcbNeeded);
// change whatever you want
PrinterInfo.pPrinterName:=PChar(NewPrinterName);
// now call set printer with the revised structure
SetPrinter(PrinterHandle,2,PrinterInfo2,0);
FreeMem(PrinterInfo);
我自己已经解决,哎!
function ChangePrinterName(sFrom, sTo: String): Boolean;
var
hPrinter : Thandle;//Cardinal;
cbRequired : DWORD;
cbBuffer : Integer;
pi4 : PRINTER_INFO_4;
ptr : array of Char;
pd : PRINTER_DEFAULTS;
begin
ZeroMemory(@pd, SizeOf(pd));
pd.DesiredAccess := PRINTER_ACCESS_USE or PRINTER_ACCESS_ADMINISTER;
Result := OpenPrinter(PChar(sFrom), hPrinter, @pd);
if Result then
begin
Result := GetPrinter(hPrinter, 4, nil, 0, @cbRequired);
if not Result then
begin
if cbRequired <> 0 then
begin
Result := True;
SetLength(ptr, cbRequired);
cbBuffer := cbRequired;
Result := GetPrinter(hPrinter, 4, @ptr[0], cbBuffer, @cbRequired);
if Result then
begin
CopyMemory(@pi4, @ptr[0], SizeOf(pi4));
pi4.pPrinterName := PChar(sTo);
CopyMemory(@ptr[0], @pi4, SizeOf(pi4)); Result := SetPrinter(hPrinter, 4, @ptr[0], 0);
end;
end;
end;
ClosePrinter(hPrinter);
end;
end;