|
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"NetShareEnum ( Win9x )"
■概要
NetShareEnum ( Windows 9x 用 )のサンプルです。
■コンポーネント
Form1 に Edit1, Memo1, Button1 を適当に配置して下さい。
■サンプル実行時
Button1 を押すと、Edit1 に入力されているサーバー上の各共有資源
に関する情報を(権限があれば... ^^;)取得し Memo1 に表示します。
Edit1.Text = '' の場合はローカルコンピュータに関する情報を取得
します。
■注意事項
・Windows98SE + Delphi5 で動作確認。
・WindowsNT/2000 では動作しません。
・本サンプルは、ご自身の責任においてお試し下さい。 (((^^;)
■その他
ローカルコンピュータ以外の情報は取得できないかも知れません??
(((^^;)
■サンプルコード
//=========================================================================
{...略...}
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
procedure NetShareEnumProc( const ServerName: String );
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
const
LM20_NNLEN = 12; // Maximum share name length
LM20_MAXCOMMENTSZ = 48; // Maximum comment size
SHPWLEN = 8; // Maximum password length
{* NET_API_STATUS Value *}
NERR_Success = 0;
{* Network resource type *}
STYPE_DISKTREE = 0; // Disk drive
STYPE_PRINTQ = 1; // Print queue
STYPE_DEVICE = 2; // Communication device
STYPE_IPC = 3; // IPC(Interprocess Communication)
// STYPE_SPECIAL = $80000000; // IPC$ or ADMIN$
{* Share-level *}
SHI50F_RDONLY = $0001; // read-only access.
SHI50F_FULL = $0002; // read/write access
SHI50F_DEPENDSON = SHI50F_RDONLY + SHI50F_FULL;
SHI50F_ACCESSMASK = SHI50F_RDONLY + SHI50F_FULL;
SHI50F_PERSIST = $0100; // The share is restored at system startup.
SHI50F_SYSTEM = $0200; // The share is a hidden share, and normally
// is not visible.
MAX_ENTRIES = 20;
type
{* Shared resource info. *}
Pshare_info_50 = ^Tshare_info_50;
Tshare_info_50 = packed record
shi50_netname: array[0..LM20_NNLEN] of Char;
shi50_type : Byte;
shi50_flags : WORD;
shi50_remark : PChar;
shi50_path : PChar;
shi50_rw_password: array[ 0..SHPWLEN ] of Char;
shi50_ro_password: array[ 0..SHPWLEN ] of Char;
end;{Tshare_info_50}
NET_API_STATUS = DWORD;
{* NetShareEnum 宣言 *}
function NetShareEnum( const pszServer: PChar;
sLevel: Smallint;
pbBuffer: Pshare_info_50;
cbBuffer: WORD;
var cEntriesRead, cTotalAvail: WORD
): NET_API_STATUS; stdcall; external 'SvrApi.dll';
{ TForm1 }
{*************************************************************************
NetShareEnumProc
//***********************************************************************}
procedure TForm1.NetShareEnumProc( const ServerName: String );
var
Info50Size,
ABuffSize : WORD;
pbBuffer : Pointer;
cbBuffer,
cEntriesRead,
cTotalAvail : WORD;
NetStatus : NET_API_STATUS;
const
CRTb = #13#10#9;
StrBufSize = LM20_MAXCOMMENTSZ + MAX_PATH + 1;
function GetTypeStr( const fshi50_type: Byte ): String;
begin
Result := '';
case fshi50_type of
STYPE_DISKTREE: Result := 'Type: Disk drive';
STYPE_PRINTQ : Result := 'Type: Print queue';
STYPE_DEVICE : Result := 'Type: Communication device';
STYPE_IPC : Result := 'Type: IPC';
end;{case shi50_type of}
end;
function GetAccessStr( const fshi50_flags: WORD ): String;
begin
Result := '';
if fshi50_flags and SHI50F_RDONLY <> 0 then
Result := 'Read-only access.' + CRTb;
if fshi50_flags and SHI50F_FULL <> 0 then
Result := Result +'Read/Write access.'+ CRTb;
if fshi50_flags and SHI50F_PERSIST <> 0 then
Result := Result +'The share is restored at system startup.' + CRTb;
if fshi50_flags and SHI50F_SYSTEM <> 0 then
begin
Result := Result
+ 'A hidden share, and normally is not visible.' + CRTb;
end;
end;
procedure Enumerate;
var
i : WORD;
pos : PChar;
TempStr: String;
begin
Memo1.Clear;
TempStr := '';
pos := PChar( pbBuffer );
for i := 0 to cEntriesRead - 1 do begin
with Pshare_info_50( pos )^ do begin
TempStr := 'Share: ' + shi50_netname + CRTb;
TempStr := TempStr + GetTypeStr( shi50_type ) + CRTb;
TempStr := TempSTr + GetAccessStr( shi50_flags );
if shi50_remark <> nil then
TempStr := TempStr + 'Remark: ' + String(shi50_remark) + CRTb;
if shi50_path <> nil then
TempStr := TempStr + 'Path: ' + String(shi50_path) + CRTb;
TempStr := TempStr + 'RWPass: ' + shi50_rw_password + CRTb
+ 'ROPass: ' + shi50_ro_password;
end;{with Pshare_info_50( pos )^ do}
Memo1.Lines.Add( TempStr );
Inc( pos, Info50Size );
end;{for i := 0 to cEntriesRead - 1 do}
end;
begin
cEntriesRead := 0; cTotalAvail := 0;
Info50Size := SizeOf( Tshare_info_50 );
ABuffSize := Info50Size + StrBufSize;
cbBuffer := ABuffSize * MAX_ENTRIES;
pbBuffer := AllocMem( cbBuffer );
try
NetStatus := NetShareEnum( PChar( ServerName ), 50, pbBuffer,
cbBuffer, cEntriesRead, cTotalAvail );
if NetStatus = ERROR_MORE_DATA then
begin
cbBuffer := ABuffSize * cTotalAvail;
ReAllocMem( pbBuffer, cbBuffer );
cEntriesRead := 0; cTotalAvail := 0;
NetStatus := NetShareEnum( PChar( ServerName ), 50, pbBuffer,
cbBuffer, cEntriesRead, cTotalAvail );
end;{if NetStatus = ERROR_MORE_DATA then}
case NetStatus of
NERR_Success:
begin
Enumerate;
end;{NERR_Success}
ERROR_NETWORK_ACCESS_DENIED:
begin
raise Exception.Create( 'アクセスは拒否されました.' );
end;{ERROR_NETWORK_ACCESS_DENIED}
ERROR_MORE_DATA:
begin
Enumerate;
if cEntriesRead < cTotalAvail then
Memo1.Lines.Add( '※まだ列挙されていないデータがあります.' );
end;{ERROR_MORE_DATA}
else RaiseLastWin32Error;
end;{case NetStatus of}
finally
FreeMem( pbBuffer );
end;{try..finally..}
end;
{*************************************************************************
Button1 OnClick
//***********************************************************************}
procedure TForm1.Button1Click(Sender: TObject);
begin
NetShareEnumProc( Edit1.Text );
end;
{*************************************************************************
//***********************************************************************}
{...略...}
end.
//=========================================================================
00/11/22(Wed) 02:31pm Fermion [KHF03264]
Original document by Fermion 氏 ID:(KHF03264)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|