お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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