1
我使用Windows外壳枚举控制面板中的项目,并在备忘录中添加项目名称,在最终版本IShellFolder
和PITEMIDLIST
中但出现错误。为什么我在调用IShellFolder._Release时遇到错误?
代码:
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
?有没有其他的方式来释放它们?或者在我释放它们之前需要做出判断?
不确定,尝试在获取它们时反向释放... – Yahia
不要调用'_Release'。如果你需要放开你的接口,写下'intf:= nil' –
@DavidHeffernan像这样:'psfDeskTop:= nil; pEnumList:= nil;'? – Hanlin