如何从Delphi代码的IShellItem2.GetProperty输出中获取FindData结构?

问题描述 投票:0回答:2

我正在用IShellFolder枚举Windows shell,并努力从IShellItem2.GetProperty的TPropVariant输出中获取FindData结构,以便我可以探索其内容。

问题是:如何从Delphi代码的TPropVariant输出中获取FindData?在这种情况下,C ++代码片段无济于事(这就是我要发布的原因,因为有些内容我无法正确翻译。)

我拥有的是:

var  
  ShellItem2: IShellItem2;
  ppropvar: TPropVariant;
  HR: HResult;
  FindData: TWin32FindData;
  FileSize: Int64;

if ShellItem2.GetProperty(PKEY_FindData, ppropvar) = S_OK then
begin
  //It's ok, then how do I get FindData?

  //Calculate the file size, for instace.
  FileSize := FindData.nFileSizeLow or Int64(FindData.nFileSizeHigh) shl 32;
end;
windows delphi vcl delphi-xe5
2个回答
0
投票

我找不到有关WIN32_FIND_DATA如何存储在PROPVARIANT中的任何正式文档。但是,基于this Qt code patch中的代码段,PROPVARIANT的最后一个字段包含指向WIN32_FIND_DATAW的指针,因此请尝试如下操作:

type
  PWin32FindDataW = ^TWin32FindDataW;
  PPWin32FindDataW = ^PWin32FindDataW;
var
  ShellItem2: IShellItem2;
  ppropvar: TPropVariant;
  FindData: PWin32FindDataW;
  FileSize: UInt64;
begin
  ...
  if ShellItem2.GetProperty(PKEY_FindData, ppropvar) = S_OK then begin
    FindData := PPWin32FindDataW(PByte(@ppropvar) + sizeof(ppropvar) - sizeof(Pointer))^;
    // alternatively:
    // FindData := PWin32FindDataW(ppropvar.caub.pElems);
    if FindData <> nil then begin
      FileSize := FindData.nFileSizeLow or (UInt64(FindData.nFileSizeHigh) shl 32);
      ...
    end;
    PropVariantClear(ppropvar);
  end;
  ...
end;

1
投票
function GetItemFindData(AItem: IShellItem2; out AFindData: TWin32FindDataW): Boolean;
var
  PV: TPropVariant;
begin
  Result := False;
  PV.vt := VT_EMPTY;
  if AItem.GetProperty(PKEY_FindData, PV) = S_OK then
    begin
      if (PV.vt = VT_UI1 or VT_VECTOR) and (PV.caub.cElems = SizeOf(AFindData)) and Assigned(PV.caub.pElems) then
        begin
          CopyMemory(@AFindData, PV.caub.pElems, SizeOf(AFindData));
          Result := True;
        end;
      PropVariantClear(PV);
    end;
end;
© www.soinside.com 2019 - 2024. All rights reserved.