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

Popular posts from this blog

c# - Validate object ID from GET to POST -

node.js - Custom Model Validator SailsJS -

php - Find a regex to take part of Email -