Delphi 为什么调用IShellFolder时会出现错误。\u Release?
我使用WindowsShell枚举控制面板中的项目,并将项目名称添加到备忘录、最终版本IShellFolder和PITEMIDLIST中,但出现错误 代码: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
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释放它。下一步。不要在循环之外释放它,那太晚了。您需要在循环内部释放它。