请问如何使用程序搜索局域网机器上安装全部打印机。想做一个局域网打印机管理程序!

解决方案 »

  1.   

    The EnumPrinters function enumerates available printers, print servers, domains, or print providers. BOOL EnumPrinters(    DWORD Flags, // types of printer objects to enumerate 
        LPTSTR Name, // name of printer object 
        DWORD Level, // specifies type of printer info structure 
        LPBYTE pPrinterEnum, // pointer to buffer to receive printer info structures 
        DWORD cbBuf, // size, in bytes, of array 
        LPDWORD pcbNeeded, // pointer to variable with no. of bytes copied (or required) 
        LPDWORD pcReturned  // pointer to variable with no. of printer info. structures copied 
       );
      

  2.   

    首先第一步:找出所有的网络类型
    NetworkTypeList := TList.Create;
      Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_PRINT,
                               0, Nil,lphEnum);
      If Res <> NO_ERROR Then exit;//执行失败
      Count := $FFFFFFFF;//不限资源数目
          BufSize := 8192;//缓冲区大小设置为8K
          GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
          Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);//获取网络类型信息
          If ( Res = ERROR_NO_MORE_ITEMS )//资源列举完毕
          or (Res <> NO_ERROR )//执行失败
          Then Exit;
          P := TNetResourceArray(Buf);
          For I := 0 To Count - 1 Do//记录各个网络类型的信息
          Begin
              NetworkTypeList.Add(P);
              Inc(P);
          End;
          //-------------------------------------------------------------
          Res := WNetCloseEnum(lphEnum);//关闭一次列举
          If Res <> NO_ERROR Then exit;
      

  3.   

    第二步:在找出网络类型的基础上,列出所有工作组的信息
    For J := 0 To NetworkTypeList.Count-1 Do //列出各个网络类型中的所有工作组名称
          Begin//列出一个网络类型中的所有工作组名称
              NetResource := TNetResource(NetworkTypeList.Items[J]^);//网络类型信息
    //获取某个网络类型的文件资源的句柄,NetResource为网络类型信息,lphEnum为返回名柄
              Res := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_PRINT,
                                  0, @NetResource,lphEnum);
              If Res <> NO_ERROR Then break;//执行失败          While true Do//列举一个网络类型的所有工作组的信息
              Begin
                  Count := $FFFFFFFF;//不限资源数目
                  BufSize := 8192;//缓冲区大小设置为8K
                  GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
                  //获取一个网络类型的文件资源信息,
                  Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
                  If ( Res = ERROR_NO_MORE_ITEMS ) //资源列举完毕
                  or (Res <> NO_ERROR) //执行失败
                  then break;
                  P := TNetResourceArray(Buf);
                  For I := 0 To Count - 1 Do//列举各个工作组的信息
                  Begin
                      ComboBox1.Items.Add(StrPAS( P^.lpRemoteName ));
                      //List.Add( StrPAS( P^.lpRemoteName ));//取得一个工作组的名称
                      Inc(P);
                  End;
              End;
              Res := WNetCloseEnum(lphEnum);//关闭一次列举
              If Res <> NO_ERROR Then break;//执行失败
          End;
          FreeMem(Buf);
          NetworkTypeList.Destroy;
      

  4.   

    第三步:在指定工作组下,列出所有机器名
    //列举一个工作组中的所有计算机名
          //--------------------------------------------------------------------------
          FillChar(NetResource, SizeOf(NetResource), 0);//初始化网络层次信息
          NetResource.lpRemoteName :='KCK.CN.SH';
         //NetResource.lpRemoteName := @NetResource[1];//指定工作组名称
         NetResource.dwDisplayType := RESOURCEDISPLAYTYPE_SERVER;//类型为服务器(工作组)
         NetResource.dwUsage := 0;
         NetResource.dwScope := RESOURCETYPE_PRINT;//列举文件资源信息
         //获取指定工作组的网络资源句柄
         Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_PRINT,
                              0, @NetResource,lphEnum);
         If Res <> NO_ERROR Then Exit; //执行失败
         While True Do//列举指定工作组的网络资源
         Begin
             Count := $FFFFFFFF;//不限资源数目
             BufSize := 8192;//缓冲区大小设置为8K
             GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
             //获取计算机名称
             Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
             If Res = ERROR_NO_MORE_ITEMS Then break;//资源列举完毕
             If (Res <> NO_ERROR) then Exit;//执行失败
             Temp := TNetResourceArray(Buf);
             For Ind := 0 to Count - 1 do//列举工作组的计算机名称
             Begin
                 //获取工作组的计算机名称,+2表示删除"\\",如\\wangfajun=>wangfajun
                 ComboBox2.Items.Add(Temp^.lpRemoteName);
                 //ComboBox2.Items.Add(Temp^.lpRemoteName + 2);
                 Inc(Temp);
             End;
         End;
         Res := WNetCloseEnum(lphEnum);//关闭一次列举
         If Res <> NO_ERROR Then exit;//执行失败
         FreeMem(Buf);