2

英語が苦手なことをお詫びしますが、私の質問をご理解いただければ幸いです。WinAPI関数の使用に問題がありますStgOpenStorageEx。ファイルの概要情報を取得する必要があります。私はいくつかの解決策を見つけましたが、それらすべてで私はを使用する必要がありますStgOpenStorageEx。標準モジュールにはないので、このようにole32.dllからエクスポートされたものとして自分で宣言しました

function StgOpenStorageEx (
  const pwcsName : POleStr;  //Pointer to the path of the
                             //file containing storage object
  grfMode : LongInt;         //Specifies the access mode for the object
  stgfmt : DWORD;            //Specifies the storage file format
  grfAttrs : DWORD;          //Reserved; must be zero
  pStgOptions : Pointer;     //Address of STGOPTIONS pointer
  reserved2 : Pointer;       //Reserved; must be zero
  riid : PGUID;              //Specifies the GUID of the interface pointer 
  out stgOpen :              //Address of an interface pointer
  IStorage ) : HResult; stdcall; external 'ole32.dll';   

次に、この関数をこのように使用する必要があります

    var
        res, open: hresult;
        stg: IStorage;
        PropSetStg: IPropertySetStorage;
        PropStg: IPropertyStorage;
        FileName: string;

    const
        IID_IPropertySetStorage : TGUID =     '{0000013A-0000-0000-C000-000000000046}';
        FmtID_SummaryInformation: TGUID =     '{F29F85E0-4FF9-1068-AB91-08002B27B3D9}';

    function StgOpenStorageEx (
     const pwcsName : POleStr;  //Pointer to the path of the
                                //file containing storage object
     grfMode : LongInt;         //Specifies the access mode for the object
     stgfmt : DWORD;            //Specifies the storage file format
     grfAttrs : DWORD;          //Reserved; must be zero
     pStgOptions : Pointer;     //Address of STGOPTIONS pointer
     reserved2 : Pointer;       //Reserved; must be zero
     riid : PGUID;              //Specifies the GUID of the interface pointer
     out stgOpen :              //Address of an interface pointer
     IStorage ) : HResult; stdcall; external 'ole32.dll';
     ...
     implementation
     ...
     FileName:=OpenDialog1.FileName;
     res:=StgOpenStorageEx(PWideChar(FileName),
        STGM_READ or STGM_SHARE_DENY_WRITE,
        STGFMT_FILE,
        0, nil,  nil, @IID_IPropertySetStorage, stg);
     OleCheck(res);

     PropSetStg := Stg as IPropertySetStorage;

     open:=PropSetStg.Open(FmtID_SummaryInformation,
        STGFMT_FILE or STGM_READ or STGM_SHARE_EXCLUSIVE, PropStg); //open=-2147287038 
     OleCheck(open); // EOleSysError "%1 could not be found
     ...

命令OLECheck(Open)で、EOleSysError "%1が見つかりませんでした"があります。 Open-2147287038を返します

私が間違っていることを教えてください 完全な機能コードの記事

IDE:Embarcadero®Delphi®XEバージョン15.0.3890.34076

4

1 に答える 1

2

このコードスニペットは、禁止されているステータスにもかかわらず、STGFMT_ANYを使用します。 http://forum.sources.ru/index.php?showtopic=115495

それがうまくいくなら、多分それは行く方法です。(以前に使用されていたコード-UnicodeDelphi。Unicode対応Delphiへのアップグレードの通常のチェックと簡略化を適用する必要があります)

このスニペットは、型キャストの代わりにStringToOleStrを使用します。また、Delphi XE2でも、その関数は型キャストスタブ以上のものであるため、違いが生じる可能性があります。

このスニペットは、内部プロパティを持つファイル(DOC、XLS、MSCファイルなど)と、VistaのNTFS-5によって「たぶん」だけが外部プロパティにラップされるファイルも区別します。STGFMT_ *定数は、たとえばDOCファイルとJPEGファイルでは異なる必要があります。

http://msdn.microsoft.com/en-us/library/windows/desktop/aa380330.aspx

于 2012-08-24T12:24:45.377 に答える