1

IShellFolder我使用 windows shell 枚举控制面板中的项目并在 memo 中添加项目名称,最终发布PITEMIDLIST但得到错误。

代码 :

procedure TForm1.Button1Click(Sender: TObject);
var
  psfDeskTop : IShellFolder;
  psfControl : IShellFolder;
  pidControl : PITEMIDLIST;
  pidChild : PITEMIDLIST;
  pidAbsolute : PItemIdList;
  pEnumList : IEnumIDList;
  celtFetched : ULONG;
  FileInfo : SHFILEINFOW;

begin

  OleCheck(SHGetDesktopFolder(psfDeskTop));
  OleCheck(SHGetSpecialFolderLocation(0, CSIDL_CONTROLS, pidControl));
  OleCheck(psfDeskTop.BindToObject(pidControl, nil, IID_IShellFolder,
    psfControl));
  OleCheck(psfControl.EnumObjects(0, SHCONTF_NONFOLDERS or SHCONTF_INCLUDEHIDDEN
    or SHCONTF_FOLDERS, pEnumList));
  while pEnumList.Next(1, pidChild, celtFetched) = 0 do
  begin

    pidAbsolute := ILCombine(pidControl, pidChild);
    SHGetFileInfo(LPCTSTR(pidAbsolute), 0, FileInfo, SizeOf(FileInfo),
      SHGFI_PIDL or SHGFI_DISPLAYNAME);
    Memo1.Lines.Add(FileInfo.szDisplayName);

  end;
  //OK
  psfDeskTop._Release;
  //Error
  psfControl._Release;
  //Error
  //pEnumList._Release;
  CoTaskMemFree(pidControl);
  CoTaskMemFree(pidChild);
  CoTaskMemFree(pidAbsolute);
end;

为什么可以发布psfDeskTop但发布时出错psfControl and pEnumList?有没有其他方法可以释放它们?还是在释放它们之前我需要一些判断?

4

1 回答 1

4

接口对象由内部引用计数器释放,不需要释放它们(您不应释放它们)。

于 2012-11-14T16:03:37.250 回答