-1

私は Delphi 開発者であり、ネットウェア用にプログラミングしたことはありません。しかし、ネットウェア共有上のファイルの所有者を見つける必要があります。いくつかの調査の後、ニュースグループ (元の著者: Chris Morgan) からこのコード スニペットを入手しました。これは基本的に、ネットウェア dll を動的にロードし、ファイルの「所有者」情報を取得する方法です。関数 GetNetwareFileOwner を見てください。

問題は、テスト用のネットウェア共有に直接アクセスできないことです。私は毎回、ネットワーク共有上のファイルを選択してテストし、結果を報告するユーザーに小さなテスト プログラムを送信しています。NWIntScanExtenedInfo の呼び出しの後に小さなコードを挿入することでエラー コードを取得していますが、以下のエラー コードで失敗します。何が間違っている可能性がありますか?

エラー コード: 1) 最初に、次のコードは上記の呼び出しでエラー 899E (INVALID_FILENAME) を返しました。ファイル名は英語で、特殊文字はありません。そして、ファイルは通常のファイルを開くダイアログで共有上で選択されました。

2) その後、大文字と小文字の問題を疑って、2 つの AnsiUpperCase 行にコメントを付けて、ファイルを開くダイアログが受け取った名前を元の大文字と小文字で正確に保持しました。これにより、エラー 89FF (NO_FILES_FOUND_ERROR) が発生します。

PS Delphi 2007 でテストをコンパイルしました。トップ構造の構造に問題がある可能性があります。バイト長とアラインメントをチェックしていません。そうします。

// netware records and function definitions
type
   // sizeof(NW_EXT_FILE_INFO) should be 140 bytes - check byte alignment
   NW_EXT_FILE_INFO = record
      sequence: integer;
      parent: integer;
      attributes: integer;
      uniqueID: shortint;
      flags: shortint;
      nameSpace: shortint;
      nameLength: shortint;
      name: array[0..11] of shortint;
      creationDateAndTime: integer;
      ownerID: integer;
      lastArchiveDateAndTime: integer;
      lastArchiverID: integer;
      updateDateAndTime: integer;
      lastUpdatorID: integer;
      dataForkSize: integer;
      dataForkFirstFAT: integer;
      nextTrusteeEntry: integer;
      reserved: array[0..35] of shortint;
      inheritedRightsMask: word;
      lastAccessDate: word;
      deletedFileTime: integer;
      deletedDateAndTime: integer;
      deletorID: integer;
      reserved2: array[0..15] of shortint;
      otherForkSize: array[0..1] of integer;
   end;

   // functions defined in CALWIN32.DLL
   TNWCallsInit = function(reserved1: pointer;
      reserved2: pointer): integer; stdcall;
   TNWCallsTerm = function(reserved: pointer): integer; stdcall;
   TNWParseNetWarePath = function(const path: pchar;  var conn: cardinal;
      var dirhandle: cardinal; newpath: pchar): integer; stdcall;
   TNWAllocTemporaryDirectoryHandle = function(conn: cardinal;
      dirhandle: cardinal; const path: pchar; var newdirhandle: cardinal;
      rightsmask: pshortint): integer; stdcall;
   TNWDeallocateDirectoryHandle = function(conn: cardinal;
      dirhandle: cardinal): integer; stdcall;
   TNWIntScanExtendedInfo = function(conn: cardinal; dirhandle: cardinal;
      attrs: shortint; iterhandle: Pinteger; const searchPattern: pchar;
      var entryinfo: NW_EXT_FILE_INFO; augmentflag: shortint): integer;
stdcall;
   TNWGetObjectName = function(conn: cardinal; objID: integer;
      objname: pchar; objtype: pword): integer; stdcall;

const
   FA_NORMAL = $00;
   FA_HIDDEN = $02;
   FA_SYSTEM = $04;
   // return codes
   SUCCESSFUL = $00;
   NOT_MY_RESOURCE = $883C;

// get file owner for Netware server file
function GetNetwareFileOwner(const FilePath: string): string;
var
   hcalwin:                         HINST;
   NWCallsInit:                     TNWCallsInit;
   NWParseNetWarePath:              TNWParseNetWarePath;
   NWAllocTemporaryDirectoryHandle: TNWAllocTemporaryDirectoryHandle;
   NWIntScanExtendedInfo:           TNWIntScanExtendedInfo;
   NWGetObjectName:                 TNWGetObjectName;
   NWDeallocateDirectoryHandle:     TNWDeallocateDirectoryHandle;
   NWCallsTerm:                     TNWCallsTerm;
   hconn,
   hdir,
   retcode:                         cardinal;
   filedir:                         string; { DOS path of parent folder
(upper case) }
   nwfilename:                      string; { DOS filename (upper case) }
   nwfiledir:                       array[0..255] of char; { Netware path of
parent folder }
   rights:                          shortint;
   i:                               integer;
   entryinfo:                       NW_EXT_FILE_INFO;
   objtype:                         word;
begin
   Result := '';
   // load netware client library and required functions
   hcalwin := LoadLibrary('calwin32.dll');
   if hcalwin<=0 then exit; // netware client not present on PC

   @NWCallsInit := GetProcAddress(hcalwin,'NWCallsInit');
   @NWParseNetWarePath := GetProcAddress(hcalwin,'NWParseNetWarePath');
   @NWAllocTemporaryDirectoryHandle := GetProcAddress(hcalwin,

'NWAllocTemporaryDirectoryHandle');
   @NWIntScanExtendedInfo :=
GetProcAddress(hcalwin,'NWIntScanExtendedInfo');
   @NWGetObjectName := GetProcAddress(hcalwin,'NWGetObjectName');
   @NWDeallocateDirectoryHandle := GetProcAddress(hcalwin,
                                      'NWDeallocateDirectoryHandle');
   @NWCallsTerm := GetProcAddress(hcalwin,'NWCallsTerm');

   // initialise netware libs
   if NWCallsInit(nil,nil)<>SUCCESSFUL then exit;
   try
      filedir := AnsiUpperCase(ExtractFileDir(FilePath));
      retcode := NWParseNetWarePath(pchar(filedir),hconn,hdir,nwfiledir);
      if retcode=NOT_MY_RESOURCE then exit; // local or non-netware disk

      // get a dir handle
      NWAllocTemporaryDirectoryHandle(hconn,0,nwfiledir,hdir,@rights);

      // get the file info
      i := -1;
      nwfilename := AnsiUpperCase(ExtractFileName(FilePath));
      retcode := NWIntScanExtendedInfo(hconn,hdir,
                    FA_NORMAL+FA_SYSTEM+FA_HIDDEN,
                    @i,pchar(nwfilename),entryinfo,0);

      if retcode=SUCCESSFUL then begin
         // get file owner name from ID
         SetLength(Result,MAX_PATH);
         retcode := NWGetObjectName(hconn,entryinfo.ownerID,
                       pchar(Result),@objtype);
         if retcode=SUCCESSFUL then
            SetLength(Result,Length(Result)) // got owner
         else SetLength(Result,0); // failed to get owner
      end;

      // deallocate dir handle
      NWDeallocateDirectoryHandle(hconn,hdir);
   finally
      // clean up
      NWCallsTerm(nil);
      FreeLibrary(hcalwin);
   end;
end;
4

1 に答える 1

0

stdcall についてよろしいですか? Tru cdecl など。また、デルフィのバージョンに関する情報を提供しました。delphi2009 より前のバージョンを使用する場合、pchar は 1 バイト文字です。ただし、delphi2009 以降を使用する場合、pchar は 2 バイト char です。したがって、1 バイト文字が必要な場合は、PAnsiChar insthead を使用する必要があります。ネットウェアの dll パラメータが Unicode なのか ANSI なのかわかりません...

シェール。

A.

于 2013-11-19T10:05:48.497 に答える