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

也许这是要走的路,如果它确实有效。(该代码在 unicode Delphi 之前使用。需要应用升级到 Unicode 感知 Delphi 的常规检查和简化)

该片段使用StringToOleStr而不是 typecast,因为即使在 Delphi XE2 中,该功能仍然不仅仅是 typecast 存根 - 它可能会有所不同。

该片段还区分了具有内部属性的文件(如 DOC、XLS、MSC 文件)和那些仅“可能”被 Vista 中的 NTFS-5 包装到外部属性中的文件。例如,对于 DOC 和 JPEG 文件,STGFMT_* 常量应该不同。

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

于 2012-08-24T12:24:45.377 回答