如题,在程序里如何用API函数重命名打印机?请给出整代码,谢谢!

解决方案 »

  1.   

    试试修改注册表里的项HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Devices
      

  2.   

    GetProfileString可以获取信息,更改的话,
    Windows的Win.ini文件中有下面的一些配置信息:
    [Windows]
    load = 
    run =
    NullPort = None
    device = HPLaserJetIII,HPPCL5MS,LPT1
    更改device可能行得通
      

  3.   


    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; 
      

  4.   


    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;
      

  5.   

    http://hi.baidu.com/gamevip/blog/item/293488b1376a785408230201.html
    vb代码可以参考一下
      

  6.   


    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
      

  7.   

    这个样子不是我想要的,我想用api 如setprinter,来解决
      

  8.   


    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);
      

  9.   


    我自己已经解决,哎!
    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;