如何得到共享共享资源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;
************* 请问怎样获取所有能访问的网上邻居中的计算机名称列表? 通过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.
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;
请问怎样获取所有能访问的网上邻居中的计算机名称列表?
通过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.