2012-07-22 2 views
1

네트워크상의 컴퓨터와 장치를 열거 할 수있는 방법은 많지만 Windows 파일 공유에 사용할 수있는 컴퓨터는 어떻게 표시합니까? 네트워크 컴퓨터와 해당 공유 폴더에 대한 트리보기를 제공해야합니다. 나는 이것을 위해 기존의 쉘 컨트롤을 사용할 수 있다는 것을 알고 있지만, 내 자신의 트리 뷰에서이를 유지하려고한다. 공유 폴더가있는 네트워크의 컴퓨터 만 나열됩니다. 컴퓨터와 공유 폴더를 지나서 개별 디렉터리 목록 부분을 직접 할 수 있습니다. 컴퓨터 목록과 공유 폴더 목록을 얻는 방법을 알아야합니다.네트워크 컴퓨터 및 공유 폴더 목록을 트리보기로 열거합니까?

답변

2

WNetOpenEnum는 WNetOpenEnum 기능은 네트워크 자원 또는 기존 연결의 열거를 시작하는 네트워크

에 당신에게 모든 컴퓨터를 제공 할 것입니다. WNetEnumResource 함수를 호출하여 열거를 계속할 수 있습니다.

NetShareEnum 당신은 모두 컴퓨터에서 공유 할 것입니다.

서버의 각 공유 리소스에 대한 정보를 검색합니다.

당신은 WNetOpenEnum/WNetOpenEnum 윈도우 API 사용 예제 델파이 코드에 관심이 있다면

+1

Msdn ** NetSharesEnum ** 항목에서 발췌 한 추가 내용 : WNetEnumResource 함수를 사용하여 자원 정보를 검색 할 수도 있습니다. 그러나 WNetEnumResource는 숨겨진 공유 또는 열람 된 공유에 열거 된 사용자를 나열하지 않습니다. 숨겨진 리소스를 열거하면 OP 요구 사항의 일부입니다 ** NetShareEnum **은 옵션이 아닙니다. – menjaraz

3

다음 리소스를 고려하시기 바랍니다 원하지 않는 것을 필터링 둘의 조합을 사용할 수 있습니다

NETRESOURCE structure의 명령이 있어야합니다.

나는 PERSONNALY http://www.developpez.net의 포럼에서 다음 목록을 권장합니다

목록 # 1 :


unit Unit1; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, Unit2; 

type 
    TForm1 = class(TForm) 
    ListBox1: TListBox; 
    procedure FormCreate(Sender: TObject); 
    private 
    procedure EnumNetworkProc(const aNetResource :TNetResource; const aLevel :word; var aContinue :boolean); 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

{ TForm1 } 

procedure TForm1.EnumNetworkProc(const aNetResource :TNetResource; const aLevel :word; var aContinue :boolean); 
begin 
    if aNetResource.dwDisplayType in [RESOURCEDISPLAYTYPE_DOMAIN, RESOURCEDISPLAYTYPE_SERVER] then 
    ListBox1.Items.Add(StringOfChar(' ', aLevel*4) +aNetResource.lpRemoteName); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    EnumNetwork(EnumNetworkProc, RESOURCE_GLOBALNET, RESOURCETYPE_DISK); 
end; 

end. 

목록 # 2 :

unit Unit2; 

interface 

uses Windows; 

type 
    TEnumNetworkProc = procedure(const aNetResource :TNetResource; const aLevel :word; var aContinue :boolean) of object; 

procedure EnumNetwork(const aEnumNetworkProc :TEnumNetworkProc; const aScope :dword = RESOURCE_GLOBALNET; const aType :dword = RESOURCETYPE_ANY); 

implementation 

//Procédure récursive 
procedure DoEnumNetwork(const aContainer :Pointer; 
         const aEnumNetworkProc :TEnumNetworkProc; 
         const aScope :dword; 
         const aType :dword; 
         const aLevel :byte); 
type 
    PNetResourceArray = ^TNetResourceArray; 
    TNetResourceArray = array [0..0] of TNetResource; 
var 
    NetHandle :THandle; 
    NetResources :PNetResourceArray; 
    NetResult :dword; 
    Size, Count, i :Cardinal; 
    Continue  :boolean; 
begin 
    Continue := TRUE; 

    NetResult := WNetOpenEnum(aScope, aType, 0, aContainer, NetHandle); 

    if NetResult = NO_ERROR then 
    try 
    //Taille de base 
    Size := 50 *SizeOf(TNetResource); 
    GetMem(NetResources, Size); 

    try 
     while Continue do 
     begin 
     Count := $FFFFFFFF; 
     NetResult := WNetEnumResource(NetHandle, Count, NetResources, Size); 

     //Taille insuffisante ? 
     if NetResult = ERROR_MORE_DATA 
     then ReallocMem(NetResources, Size) 
     else Break; 
     end; 

     //Enumère 
     if NetResult = NO_ERROR then 
     for i := 0 to Count - 1 do 
     begin 
      //Callback 
      if Assigned(aEnumNetworkProc) then 
      begin 
      aEnumNetworkProc(NetResources^[i], aLevel, Continue); 
      if not Continue then Break; 
      end; 

      //Appel récursif 
      if (NetResources^[i].dwUsage and RESOURCEUSAGE_CONTAINER) > 0 then 
      DoEnumNetwork(@NetResources^[i], aEnumNetworkProc, aScope, aType, aLevel +1); 
     end; 
    finally 
     FreeMem(NetResources, Size); 
    end; 
    finally 
    WNetCloseEnum(NetHandle); 
    end; 
end; 

procedure EnumNetwork(const aEnumNetworkProc: TEnumNetworkProc; const aScope, aType: dword); 
begin 
    DoEnumNetwork(nil, aEnumNetworkProc, aScope, aType, 0); 
end; 

end. 

,691을

출처 : Liste des machines sur un réseau local (tout le réseau de Win) - Lucas Panny의 원본 게시물 (프랑스어)

관련 문제