delphi - It is required to free the IShellFolder interface returned by SHGetDesktopFolder ? and how? -
i confused. want use function pathtopidlbind
jedi jcl , see don't release ishellfolder interfece reurned shgetdesktopfolder
after using it. microsoft docs says: "the calling application responsible freeing interface calling iunknown::release method.". tried use desktopfolder._release
access violation. i'm not sure microsoft refers to. how shold done right ?
from jedi jcl:
function pathtopidlbind(const filename:string; out folder:ishellfolder): pitemidlist; var attr, eaten: ulong; pathidlist: pitemidlist; desktopfolder: ishellfolder; path, itemname: pwidechar; begin result:=nil; path:=pwidechar(extractfilepath(filename)); itemname:=pwidechar(extractfilename(filename)); if succeeded(shgetdesktopfolder(desktopfolder)) begin attr:=0; if succeeded(desktopfolder.parsedisplayname(0, nil, path, eaten, pathidlist, attr)) begin if succeeded(desktopfolder.bindtoobject(pathidlist, nil, iid_ishellfolder, pointer(folder))) begin if failed(folder.parsedisplayname(0, nil, itemname, eaten, result, attr)) begin folder:=nil; result:=drivetopidlbind(filename, folder); end; end; pidlfree(pathidlist); end else result:=drivetopidlbind(filename, folder); end; end;
com interfaces reference counted, , delphi compiler generates code automatically manage reference counting you. each time interface variable assigned, release
called if variable not nil, , addref
called if new value not nil. when variable goes out of scope, release
called if not nil.
so mistake manually release way did. released interface manually, , compiler tried release automatically. have let compiler work.
if wish release interface before goes out of scope, assign nil
it:
desktopfolder := nil;
but there no need in example.
the delphi designers don't want explicitly call addref
, release
, named _addref
, _release
in order discourage calling these methods directly.
Comments
Post a Comment