我也不会,刚刚在MSDN里乱找了一下,看到有一个EnumPrinterConnections函数,也许有用。

解决方案 »

  1.   

    这个函数好像不是API吧,不知怎么用法?
      

  2.   

    在EDIT1中输入‘\\’+计算机名称得到计算机的共享资源,]
    ,输入工作组名,得到工作组成员,使用如下代码,改改的话就可用来找
    所有共乡的打印机了
    function tform1.getshare(mydir : string):tstrings;
    Var
    EnumHandle : THandle;
    FileRS : TNetResource;
    Buf : Array[1..500] of TNetResource;
    BufSize : DWord;
    Entries : DWord;
    s1 : tstringlist;
    Result1 : Integer;begin
    s1:=tstringlist.create;
    mydir := mydir + #0;//mydir为工作组名时可以得到组内所有主机名
    //mydir为主机名时可以得到机内所有共享文件夹名
    FillChar(FileRS, SizeOf(FileRS) , 0);
     With FileRS
     do begin
      dwScope := 2;
      dwType := 3;
      dwDisplayType := 1;
      dwUsage := 2;
      lpRemoteName := @mydir[1];
     end;
     WNetOpenEnum( RESOURCE_GLOBALNET,
     RESOURCETYPE_ANY,
    0,
    @FileRS,EnumHandle );
    Repeat
    Entries := 1;
    BufSize := SizeOf(Buf);
    Result1 := WNetEnumResource( EnumHandle,Entries,@Buf,BufSize );
    If (Result1 = NO_ERROR) and (Entries = 1) then
    begin
    s1.Add(StrPas(Buf[1].lpRemoteName)); //得到网上资源名,主机或文件夹
    if Buf[1].dwType =2 then
    begin
     s1.Add('打印机');
    end
    else
    if Buf[1].dwType =1 then
     s1.Add('文件夹');
    end ;
    Until (Entries <> 1) or (Result1 <> NO_ERROR);
    WNetCloseEnum( EnumHandle );
    result:=s1;
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var s1 : tstrings;
        i : integer;
    begin
    form1.ListBox1.items.assign(getshare(edit1.text));
    end;
      

  3.   

    可以用EnumPrinters函数(WinSpool中)procedure TForm1.ReportMessage(const AMsg: string);
    begin
      Memo1.Lines.Add(AMsg);
    end;procedure TForm1.SearchPrinters;
    var
      Buf, List: PPrinterInfo1;
      BufSize, PrinterCount: Cardinal;
      I: Integer;
    begin
      Buf := nil;
      BufSize := 0;
      PrinterCount := 0;
      ReportMessage('Searching...');
      EnumPrinters(PRINTER_ENUM_REMOTE, nil, 1, Buf, BufSize, BufSize, PrinterCount);
      GetMem(Buf, BufSize);
      List := Buf;
      if EnumPrinters(PRINTER_ENUM_REMOTE, nil, 1, Buf, BufSize, BufSize, PrinterCount) then
      begin
        ReportMessage(IntToStr(PrinterCount) + ' printers availed. Require ' + IntToStr(BufSize) + ' bytes.');
        for I := 0 to PrinterCount - 1 do
        begin
          ReportMessage('------------------------------------');
          ReportMessage('Printer[' + IntToStr(I) + ']');
          ReportMessage('Flags = ' + IntToHex(List.Flags, 8));
          ReportMessage('Name = ' + String(List.pName));
          ReportMessage('Description = ' + String(List.pDescription));
          ReportMessage('Comment = ' + String(List.pComment));
          Inc(List);
        end;
        FreeMem(Buf);
      end;
    end;
      

  4.   


    三楼的说得对,主要用这两个WNetOpenEnum(),WNetEnumSource();