1

IShellFolder最終リリースでは、Windowsシェルを使用してコントロールパネルの項目を列挙し、メモに項目名を追加しました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 に答える