나는 Windows 셸을 사용하여 제어판의 항목을 열거하고 메모에 항목 이름을 추가합니다. 최종 릴리스는 IShellFolder
과 PITEMIDLIST
이지만 오류가 발생합니다.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
? 그들을 풀어줄 다른 방법이 있습니까? 내가 그들을 풀어주기 전에 어떤 판단이 필요합니까?
잘 모르겠다면, 당신이 획득 한 것과 반대로 해제하려고 시도하십시오 ... – Yahia
'_Release'를 호출하지 마십시오. 인터페이스에서 보류 상태를 풀어 줄 필요가 있다면'intf : = nil'이라고 쓰십시오. –
@DavidHeffernan :'psfDeskTop : = nil; pEnumList : = nil;'? – Hanlin