ネットワーク上のコンピューターとデバイスを列挙する方法はたくさんありますが、Windows ファイル共有に使用できるコンピューターだけを表示するにはどうすればよいですか? ネットワーク コンピューターとその共有フォルダーのツリー ビューを提供する必要があります。これには既存のシェル コントロールを使用できることはわかっていますが、自分のツリー ビューに保持することをお勧めします。共有フォルダーを持つネットワーク上のコンピューターのみが一覧表示されます。コンピューターとその共有フォルダーを過ぎると、個々のディレクトリ リストの部分を自分で行うことができます。コンピュータのリストとその共有フォルダのリストを取得する方法を知りたいだけです。
6356 次
2 に答える
3
WNetOpenEnum/WNetOpenEnum Windows API を使用したサンプル Delphi コードに関心がある場合は、次のリソースを検討してください。
- Angus John によるネットワーク化されたドライブ:
- Windows API を使用して、Justin Swett によって EDN で公開されている利用可能なネットワーク リソースのリストを生成します。
- Delphitricks.com からネットワーク内のコンピューターのリストを取得します。
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 に答える