2012-11-14 5 views
1

나는 Windows 셸을 사용하여 제어판의 항목을 열거하고 메모에 항목 이름을 추가합니다. 최종 릴리스는 IShellFolderPITEMIDLIST이지만 오류가 발생합니다.IShellFolder._Release를 호출하면 왜 오류가 발생합니까?

코드 :이 psfDeskTop를 해제하지만 때 오류가 괜찮은지 왜

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; 

출시 psfControl and pEnumList? 그들을 풀어줄 다른 방법이 있습니까? 내가 그들을 풀어주기 전에 어떤 판단이 필요합니까?

+0

잘 모르겠다면, 당신이 획득 한 것과 반대로 해제하려고 시도하십시오 ... – Yahia

+2

'_Release'를 호출하지 마십시오. 인터페이스에서 보류 상태를 풀어 줄 필요가 있다면'intf : = nil'이라고 쓰십시오. –

+0

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

답변

4

인터페이싱 된 오브젝트는 내부 참조 카운터에 의해 해제되므로 해제 할 필요가 없습니다 (해제하지 마십시오).

+0

대단히 감사합니다. – Hanlin

관련 문제