用WNetOpenEnum等好像只能列出网络邻居上可用的资源?
有什么方法可以根据其IP地址而列出机上的共享目录?
我所在的是铁通宽带局域网;
网络邻居上只能列出自己宿舍的机子,
隔壁的就要用IPSCANE了!

解决方案 »

  1.   

    如何得到共享共享资源Function GetUserResource( UserName : string ; var List : TStringList ) : Boolean;
    Var
      NetResource : TNetResource;
      Buf : Pointer;
      Count,BufSize,Res : DWord;
      Ind : Integer;
      lphEnum : THandle;
      Temp : TNetResourceArray;
    Begin
      Result := False;
      List.Clear;
      FillChar(NetResource, SizeOf(NetResource), 0);  //初始化网络层次信息
      NetResource.lpRemoteName := @UserName[1];      //指定计算机名称
      Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY,RESOURCEUSAGE_CONNECTABLE, @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
        List.Add(Temp^.lpRemoteName);
        Inc(Temp);
        End;
    End;
    Res := WNetCloseEnum(lphEnum);          //关闭一次列举
    If Res <> NO_ERROR Then exit;          //执行失败
      Result := True;
      FreeMem(Buf);
    End;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      List:TstringList;
      i:integer;
    begin
    try
      List:=TstringList.Create;
      if GetUserResource(edit1.text,List) then
        if List.count=0 then        //指定计算机下没有找到共享资源
          begin
            memo1.Lines.Add (edit1.text+'下没有找到共享资源!');
          end
      else
        memo1.Lines.Add (edit1.text+'下的所有共享资源如下:');
        for i:=0 to List.Count-1  do
          begin
            Memo1.lines.Add (List.strings[i]);
          end;
    finally
      List:=TstringList.Create;    //如有异常则释放分配的资源
    end;
    end;uses Registry
    var reg : TRegistry; name : String; //s是在网上邻居里的文件夹名
    begin
      name := 'DirName';//建立一个只读,无密码共享目录
      reg := TRegistry.Create;
      reg.RootKey := HKEY_LOCAL_MACHINE;
      reg.OpenKey('Software\Microsoft\Windows\CurrentVersion\Network\LanMan\'+name,true );
      reg.WriteInteger( 'Flags', 401 ) ; //权限:401代表为访问,258为完全访问,259为密码访问
      reg.WriteInteger( 'Parm1enc', 0 ) ;  //参数2,放置完全访问密码,已加密
      reg.WriteInteger( 'Parm2enc', 0 ) ;  //参数2,放置只读访问密码,已加密
      reg.WriteString( 'Path', 'C:\MYDIR' ) ; //放置要共享的目录的绝对路径
      reg.WriteString( 'Re', '' ) ;
      reg.WriteInteger( 'Type', 0 ) ; 
    end;
      

  2.   

    *************
    请问怎样获取所有能访问的网上邻居中的计算机名称列表?
    通过Windows Shell API
    用SHGetSpecialFolderLocation获得Neighborhood的PIDL,然后将一个IShellFolder接
    口绑定到这个PIDL,再然后就可以用这个接口的EnumObjects函数枚举其中的对象了。
    因我不会Delphi,所以不知道用Delphi应该具体如何做,下面一段C++代码列出了"我
    的电脑"下的所有项目(我的计算机没有安装网络邻居,所以用这个代替,方法应该是
    一样的)#include <stdio.h>
    #include <iostream.h>
    #include <comdef.h>
    #include <windows.h>
    #include <shellapi.h>
    #include <shlobj.h>
    #include <shlguid.h>
    #include <shlwapi.h>void _inline error(){ cerr<<"ERROR!"<<endl; _exit(1); }void main(int argc, char* argv[])
    {
     IMallocPtr pMalloc;
     IShellFolderPtr pShellFolder,pFolder;
     LPITEMIDLIST pidl;
     IEnumIDListPtr pEnum;
     HRESULT hr;
     STRRET Name;
     ULONG celtFetched; SHGetMalloc(&pMalloc); if (!SUCCEEDED(SHGetDesktopFolder(&pShellFolder)))
      error();
     if (!SUCCEEDED(SHGetSpecialFolderLocation(NULL,CSIDL_DRIVES,&pidl)))
      error();
     pShellFolder->BindToObject(pidl,NULL,IID_IShellFolder,(LPVOID*)&pFolder); hr=pFolder->EnumObjects(NULL,SHCONTF_FOLDERS|SHCONTF_NONFOLDERS|
      SHCONTF_INCLUDEHIDDEN,&pEnum); while ((hr = pEnum->Next (1, &pidl, &celtFetched)) != S_FALSE &&
    celtFetched == 1)
     {
      hr = pFolder->GetDisplayNameOf (pidl, SHGDN_NORMAL , &Name);
      if (FAILED (hr))
      {
       error();
       break;
      }
      printf("%s\n",Name.cStr);
     } if (!pidl)
      pMalloc->Free(pidl);
    }**************
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ComCtrls, ImgList, ExtCtrls, ToolWin;type
      TForm1 = class(TForm)
        ImageList1: TImageList;
        ToolBar1: TToolBar;
        ToolButton1: TToolButton;
        Panel1: TPanel;
        ResourceTree: TTreeView;
        Splitter1: TSplitter;
        ResourceList: TListView;
        Panel2: TPanel;
        lbScope: TLabel;
        lbType: TLabel;
        lbDisplayType: TLabel;
        lbUsage: TLabel;
        lbLocalName: TLabel;
        lbRemoteName: TLabel;
        lbComment: TLabel;
        lbProvider: TLabel;
        ToolButton2: TToolButton;
        procedure Button1Click(Sender: TObject);
        procedure ResourceTreeChange(Sender: TObject; Node: TTreeNode);
        procedure ToolButton2Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        function AddTreeItem(nr:NETRESOURCE;node:TTreeNode):TTreeNode;
        function EnumNetWorkResource(lpnr:PNetResource;node:TTreeNode):Boolean;
        procedure ConnectResource(pnr:PNetResource);
      end;var
      Form1: TForm1;implementation{$R *.DFM}{ TForm1 }
    function GetLastErrorText:string;
    var
       dwSize:DWORD;
       lpszTemp:LPSTR;
    begin
         dwSize:=512;
         lpszTemp:=nil;
         try
            GetMem(lpszTemp,dwSize);
            FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_ARGUMENT_ARRAY,
            nil,GetLastError,LANG_NEUTRAL,lpszTemp,dwSize,nil);
         finally
                Result:=StrPas(lpszTemp);
                FreeMem(lpszTemp);
         end;
    end;function TForm1.EnumNetWorkResource(lpnr:PNetResource;node:TTreeNode):Boolean;
    var
    nr:NetResource;
    hEnum:THandle;
    lpnrLocal: PNETRESOURCE;
    cbBuffer:DWORD;
    cEntries,dwEnumResult:DWORD;
    i:Integer;
    LocalNode:TTreeNode;
    begin
    Result:=False;
    cbBuffer:=163840;
    cEntries:=$ffffffff;
    lpnrLocal:=nil;
    if(WNetOpenEnum(RESOURCE_GLOBALNET,
    RESOURCETYPE_ANY,
       0,
       lpnr,
       hEnum)<>NO_ERROR)then
       begin
       ShowMessage('Open enum error,node='+lpnr^.lpRemoteName);
       ShowMessage(GetLastErrorText);
       Result:=False;
       Exit;
       end;
    try
       repeat
    lpnrLocal:=PNetResource(GlobalAlloc(GPTR,cbBuffer));
        dwEnumResult:=WNetEnumResource(hEnum,
            cEntries,
               lpnrLocal,
               cbBuffer);
           if(dwEnumResult=NO_ERROR)then
            begin
               for i:=0 to cEntries-1 do
                begin
                   nr:=(PNetResource(PChar(lpnrLocal)+sizeOf(NetResource)*i))^;
                   LocalNode:=AddTreeItem(nr,node);
                   if(RESOURCEUSAGE_CONTAINER=
                    nr.dwUsage and RESOURCEUSAGE_CONTAINER)then
                       begin
                       if(not EnumNetWorkResource(@nr,LocalNode))then
                        begin
                        ShowMessage('Error enum,Parent='+lpnr^.lpRemoteName);
    ShowMessage(GetLastErrorText);
                           end;
                       end;
                   end;
               end;
       until (dwEnumResult=ERROR_NO_MORE_ITEMS);
       if(dwEnumResult=ERROR_NO_MORE_ITEMS)then
        Result:=True;
    Except
    GlobalFree(Cardinal(lpnrLocal));
    WNetCloseEnum(hEnum);
       Raise;
       end;
    GlobalFree(Cardinal(lpnrLocal));
    WNetCloseEnum(hEnum);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
    EnumNetWorkResource(nil,ResourceTree.Items[0]);
    end;function TForm1.AddTreeItem(nr: NETRESOURCE; node: TTreeNode): TTreeNode;
    var
    pnr:PNetResource;
    begin
    GetMem(pnr,SizeOf(NetResource));
    pnr^:=nr;
    Result:=ResourceTree.Items.AddChildObject(node,nr.lpRemoteName,pnr);
    if(nr.dwUsage=RESOURCEUSAGE_CONTAINER)then
    Result.ImageIndex:=0
    else Result.ImageIndex:=1;
    end;procedure TForm1.ResourceTreeChange(Sender: TObject; Node: TTreeNode);
    var
    pnr:PNetResource;
    begin
    pnr:=PNetResource(Node.Data);
    if(pnr=nil)then Exit;
    case pnr^.dwScope of
    RESOURCE_CONNECTED:
       lbScope.Caption:='Connetted';
       RESOURCE_GLOBALNET:
       lbScope.Caption:='GlobalNet';
       RESOURCE_REMEMBERED:
       lbScope.Caption:='Remembered';
       else
       lbScope.Caption:='else scope:'+IntToStr(pnr^.dwScope);
       end;case pnr^.dwType of
    RESOURCETYPE_DISK:
       lbType.Caption:='Disk';
       RESOURCETYPE_PRINT:
       lbType.Caption:='Printer';
       else
       lbType.Caption:=IntToStr(pnr^.dwType);
       end;case pnr^.dwDisplayType of
    RESOURCEDISPLAYTYPE_DOMAIN:
       lbDisplayType.Caption:='Domain';
       RESOURCEDISPLAYTYPE_GENERIC:
       lbDisplayType.Caption:='Generic';
       RESOURCEDISPLAYTYPE_SERVER:
       lbDisplayType.Caption:='Server';
       RESOURCEDISPLAYTYPE_SHARE:
       lbDisplayType.Caption:='Shared';
       else
       lbDisplayType.Caption:='else type:'+IntToStr(pnr^.dwDisplayType);
       end;case pnr^.dwUsage of
    RESOURCEUSAGE_CONTAINER:
       lbUsage.Caption:='Container';
       RESOURCEUSAGE_CONNECTABLE:
       lbUsage.Caption:='Connectable';
       else
       lbUsage.Caption:='else Usage:'+IntToStr(pnr^.dwUsage);
       end;lbLocalName.Caption:=pnr^.lpLocalName;
    lbRemoteName.Caption:=pnr^.lpRemoteName;
    lbComment.Caption:=pnr^.lpComment;
    lbProvider.Caption:=pnr^.lpProvider;//ConnectResource(pnr);
    end;procedure TForm1.ConnectResource(pnr: PNetResource);
    begin
    if((pnr^.dwUsage and RESOURCEUSAGE_CONNECTABLE)
    =RESOURCEUSAGE_CONNECTABLE)then
       begin
    {   if(WNetAddConnection2(pnr^,PChar(''),'wuwei',0)<>NO_ERROR)then
        ShowMessage(GetLastErrorText);}
    if(WNetAddConnection(pnr^.lpRemoteName,'','h:')<>NO_ERROR)then
        ShowMessage(GetLastErrorText);
       end;
    end;procedure TForm1.ToolButton2Click(Sender: TObject);
    var
    p:PNetResource;
    begin
    p:=PNetResource(ResourceTree.Selected.Data);
    ConnectResource(p);
    end;end.