2012-11-14 62 views
1

我使用Windows外壳枚举控制面板中的项目,并在备忘录中添加项目名称,在最终版本IShellFolderPITEMIDLIST中但出现错误。为什么我在调用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?有没有其他的方式来释放它们?或者在我释放它们之前需要做出判断?

+0

不确定,尝试在获取它们时反向释放... – Yahia

+2

不要调用'_Release'。如果你需要放开你的接口,写下'intf:= nil' –

+0

@DavidHeffernan像这样:'psfDeskTop:= nil; pEnumList:= nil;'? – Hanlin

回答

4

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

+0

非常感谢 – Hanlin

相关问题