1

ネットワーク上のコンピューターとデバイスを列挙する方法はたくさんありますが、Windows ファイル共有に使用できるコンピューターだけを表示するにはどうすればよいですか? ネットワーク コンピューターとその共有フォルダーのツリー ビューを提供する必要があります。これには既存のシェル コントロールを使用できることはわかっていますが、自分のツリー ビューに保持することをお勧めします。共有フォルダーを持つネットワーク上のコンピューターのみが一覧表示されます。コンピューターとその共有フォルダーを過ぎると、個々のディレクトリ リストの部分を自分で行うことができます。コンピュータのリストとその共有フォルダのリストを取得する方法を知りたいだけです。

4

2 に答える 2

3

WNetOpenEnum/WNetOpenEnum Windows API を使用したサンプル Delphi コードに関心がある場合は、次のリソースを検討してください。

NETRESOURCE 構造の優れたコマンドも必要です。

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.

出典: Liste des machines sur un réseau local (tout le réseau de Win) - Lucas Panny による元の投稿 (フランス語)。

于 2012-07-23T06:20:23.907 に答える
2

WNetOpenEnumは、ネットワーク上のすべてのコンピューターを提供します

WNetOpenEnum 関数は、ネットワーク リソースまたは既存の接続の列挙を開始します。WNetEnumResource関数を呼び出すことにより、列挙を続行できます。

NetShareEnumは、マシン上のすべての共有を行います。

サーバー上の各共有リソースに関する情報を取得します。

両方の組み合わせを使用して、不要なものを除外できます

于 2012-07-22T17:55:30.150 に答える