Delphi 为什么调用IShellFolder时会出现错误。\u Release?

Delphi 为什么调用IShellFolder时会出现错误。\u Release?,delphi,winapi,windows-shell,Delphi,Winapi,Windows Shell,我使用WindowsShell枚举控制面板中的项目,并将项目名称添加到备忘录、最终版本IShellFolder和PITEMIDLIST中,但出现错误 代码: procedure TForm1.Button1Click(Sender: TObject); var psfDeskTop : IShellFolder; psfControl : IShellFolder; pidControl : PITEMIDLIST; pidChild : PITEMIDLIST; pidAb

我使用WindowsShell枚举控制面板中的项目,并将项目名称添加到备忘录、最终版本IShellFolder和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和pEnumList时出错?有没有其他办法释放它们?还是在我释放他们之前需要一些判断

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

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

不确定,在获取它们时尝试反向释放……不要调用_release。如果需要放开对接口的控制,请编写intf:=nil@DavidHeffernan如下所示:psfDeskTop:=nil;pEnumList:=nil?是的,像那样。你为什么要这么做?当变量超出范围时,它将自动发生。仅供参考,您的循环存在内存泄漏。在调用pEnumList之前,您需要在使用完pidChild后使用CoTaskMemFree释放它。下一步。不要在循环之外释放它,那太晚了。你需要在循环中释放它。不确定,尝试在获得它们时反向释放…不要调用_release。如果需要放开对接口的控制,请编写intf:=nil@DavidHeffernan如下所示:psfDeskTop:=nil;pEnumList:=nil?是的,像那样。你为什么要这么做?当变量超出范围时,它将自动发生。仅供参考,您的循环存在内存泄漏。在调用pEnumList之前,您需要在使用完pidChild后使用CoTaskMemFree释放它。下一步。不要在循环之外释放它,那太晚了。您需要在循环内部释放它。