如题
谢谢各位!

解决方案 »

  1.   

    The EnumPrinterDrivers function enumerates all of the printer drivers installed on the specified printer server. BOOL EnumPrinterDrivers(
      LPTSTR pName,        // pointer to server name
      LPTSTR pEnvironment, // pointer to environment name
      DWORD Level,         // structure level
      LPBYTE pDriverInfo,  // pointer to an array of structures
      DWORD cbBuf,         // size, in bytes, of array
      LPDWORD pcbNeeded,   // pointer to number of bytes copied (or 
                           // required)
      LPDWORD pcReturned   // pointer to number of DRIVER_INFO. 
                           // structures
    );
      

  2.   

    Api函数列表
    --与打印相关
    Api函数名                     函数说明                                适用范围          
                                                                          W3.x W95 NT
    AddPrinterConnection          为当前用户建立与打印机的联系            否 是 是
    StartPagePrinter              开始打印机                              否 是 是
    StartDoc                      开始打印作业                            是 是 是
    StartDocPrinter               开始打印作业                            否 是 是
    AddPrintProvidor              加入一个打印机支持器                    否 是 是
    AddForm                       加入一个打印机窗体                      否 是 是
    AddPort                       加入一个打印机端口                      否 是 是
    AddMonitor                    加入一个打印机管理器                    否 是 是
    ShellExecute                  打开或打印指定文件                      否 是 是
    ClosePrinter                  关闭打开的打印机                        否 是 是
    WritePrinter                  向打印机输出数据                        否 是 是
    AddPrinter                    在打印机服务器上建立一个打印机          否 是 是
    SetAbortProc                  设备打印作业的放弃函数                  否 是 是
    SetPrinter                    设置打印机信息                          否 是 是
    SetPrinterData                设置打印机配置                          否 是 是
    SetJob                        设置打印作业信息                        否 是 是
    ResetPrinter                  设置打印数据类型和设备模式值            否 是 是
    DeletePrinterConnection       删除与打印机的连接                      否 是 是
    DeletePrintProcessor          删除打印机处理器                        否 是 是
    DeletePrinterDriver           删除打印机驱动程序                      否 是 是
    DeletePrinter                 删除打印机服务器上的打印机              否 是 是
    DeleteMonitor                 删除打印机监视器                        否 是 是
    DeletePrintProvidor           删除打印机提供者                        否 是 是
    DeleteForm                    删除打印机窗体层差                      否 是 是
    AbortPrinter                  删除打印机缓冲文件                      否 是 是
    DeletePort                    删除打印机端口                          否 是 是
    AddJob                        启动一个打印作业                        否 是 是
    AdvancedDocumentProperties    进行打印机高级设置                      否 是 是
    PrintDlg                      建立打印文本对话框                      否 是 是
    EnumPrintProcessors           枚举已安装的打印机处理器                否 是 是
    EnumPrinterDrivers            枚举已安装的打印机驱动程序              否 是 是
    EnumPorts                     枚举可用打印机端口                      否 是 是
    EnumPrintProcessorDatatypes   枚举打印机所支持的数据类型              否 是 是
    EnumForms                     枚举所支持的打印机窗体                  否 是 是
    AbortDoc                      终止一项打印作业                        是 是 是
    PrinterProperties             修改打印机属性                          否 是 是
    AddPrintProcessor             将打印处理器复制到打印机服务器中        否 是 是
    AddPrinterDriver              将打印机驱动程序复制到打印机服务器中    否 是 是
    PrinterMessageBox             显示打印作业出错信息                    否 是 是
    ConnectToPrinterDlg           显示浏览对话并连接网络打印机            否 是 是
    EndPagePrinter                结束打印页                              否 是 是
    EndDoc                        结束打印作业                            是 是 是
    EndDocPrinter                 结束打印作业                            否 是 是
    StartPage                     准备打印机接收数据                      是 是 是
    WaitForPrinterChange          监测打印机或打印机服务器变化            否 是 是
    GetPrintProcessorDirectory    获取打印机驱动处理器路径                否 是 是
    GetPrinterDriver              获取打印机驱动程序信息                  否 是 是
    GetPrinterDriverDirectory     获取打印机驱动程序路径                  否 是 是
    GetPrinter                    获取打印机信息                          否 是 是
      

  3.   

    我没写过,照上面他们说的,EnumPrinterDrivers            枚举已安装的打印机驱动程序         这个api应该可以完成
      

  4.   

    uses
      Printers, Winspool;
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ComboBox1.Items.Assign(Printer.Printers);
    end;
    procedure TForm1.ComboBox1Change(Sender: TObject);
    var
      hPrinter: THandle;
      PrtName: string;
      DriverInfo: PDriverInfo2;
      dwNeeded: DWORD;
    begin
      Memo1.Clear;
      PrtName := Combobox1.Text;
      OpenPrinter(PChar(PrtName), hPrinter, nil);
      GetPrinterDriver(hPrinter, nil, 2, DriverInfo, 0, dwNeeded);
      GetMem(DriverInfo, dwNeeded);
      if GetPrinterDriver(hPrinter, nil, 2, DriverInfo, dwNeeded, dwNeeded) then
      begin
        // Add infos to Memo1
        Memo1.Lines.Add('Version: ' + IntToStr(DriverInfo.cVersion));
        Memo1.Lines.Add(StrPas(DriverInfo.pName));
        Memo1.Lines.Add(StrPas(DriverInfo.pEnvironment));
        Memo1.Lines.Add(StrPas(DriverInfo.pDriverPath));
        Memo1.Lines.Add(StrPas(DriverInfo.pDataFile));
        Memo1.Lines.Add(StrPas(DriverInfo.pConfigFile));
      end
      else
        Memo1.Lines.Add('No Info needed = ' + IntToStr(dwNeeded));  ClosePrinter(hPrinter);
      FreeMem(DriverInfo);
    end;{2.}
    {****************************}
    { Another Code by P. Below }unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, WinSpool;type
      TForm1 = class(TForm)
        Button1: TButton;
        ListBox1: TListBox;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure ListBox1Click(Sender: TObject);
      private
        { Private-Deklarationen }
        pEnumDriversData: PDriverInfo2;  public
        { Public-Deklarationen }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.ListBox1Click(Sender: TObject);
    var
      pTemp: PDriverInfo2;
    begin
      with Sender as TListbox do 
      begin
        if ItemIndex >= 0 then 
        begin
          memo1.Clear;
          pTemp := PDriverInfo2(Items.Objects[ItemIndex]);
          with memo1.Lines, pTemp^ do 
          begin
            Add(Format('cVersion:'#9#9'%d', [cVersion]));
            Add(Format('pName:'#9#9'%s', [pName]));
            Add(Format('pEnvironment:'#9'%s', [pEnvironment]));
            Add(Format('pDriverPath:'#9'%s', [pDriverPath]));
            Add(Format('pDataFile:'#9#9'%s', [pDataFile]));
            Add(Format('pConfigFile:'#9'%s', [pConfigFile]));
          end;
        end;
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      i, bytesNeeded: DWORD;
      pTemp: PDriverInfo2;
      NumDrivers: DWORD;
    begin
      listbox1.Clear;
      if Assigned(pEnumDriversData) then
        FreeMem(pEnumDriversData);
      // get number of installed drivers
      Numdrivers := 0;
      bytesNeeded := 0;
      EnumPrinterDrivers(nil, nil, 2, nil, 0, bytesNeeded, NumDrivers);
      if bytesNeeded = 0 then 
      begin
        ShowMessage('No printer drivers installed!');
        Exit;
      end;  // allocate memory for the driver data
      GetMem(pEnumDriversData, bytesNeeded);
      // fetch driver data
      if EnumPrinterDrivers(nil, nil, 2, pEnumDriversData, bytesNeeded,
        bytesNeeded, NumDrivers) then 
      begin
        // add drivers to listbox1
        pTemp := pEnumDriversData;
        for i := 1 to Numdrivers do 
        begin
          listbox1.Items.AddObject(pTemp^.pName, TObject(pTemp));
          Inc(pTemp);
          // Note: Inc increments a pointer by the size of its base type!
        end;
        listbox1.ItemIndex := 0;
        listbox1Click(listbox1);
      end
      else
        RaiseLastWin32Error;
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      if Assigned(pEnumDriversData) then
        FreeMem(pEnumDriversData);
    end;end.
      

  5.   

    to ly_liuyang:
       首先谢谢您的回答!
       我这里有3台不同型号的打印机,按您的两种方法测试过了,有两个问题:
       1、打印机型号、路径取过来都是对的,但是打印机驱动程序版本(VERSION)取出来的值都是3,奇怪!
       2、在WIN98下取不到任何值,有没有方法在98下能取到值。
    请继续指教,谢谢!