gpt4 book ai didi

delphi - 需要释放 SHGetDesktopFolder 返回的 IShellFolder 接口(interface)吗?如何?

转载 作者:行者123 更新时间:2023-12-03 19:51:45 26 4
gpt4 key购买 nike

我很困惑。我想使用函数PathToPidlBind来自 Jedi JCL,我看到他们没有释放 SHGetDesktopFolder 重复的 IShellFolder 干扰使用后。微软文档说:“调用应用程序负责通过调用其 IUnknown::Release 方法最终释放接口(interface)。”。我尝试使用 DesktopFolder._Release但我得到访问冲突。我不确定这是否是微软所指的。那么这应该怎么做呢?

来自绝地 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)) then begin
Attr:=0;
if Succeeded(DesktopFolder.ParseDisplayName(0, nil, Path, Eaten, PathIdList, Attr)) then begin
if Succeeded(DesktopFolder.BindToObject(PathIdList, nil, IID_IShellFolder, Pointer(Folder))) then begin
if Failed(Folder.ParseDisplayName(0, nil, ItemName, Eaten, Result, Attr)) then begin
Folder:=nil;
Result:=DriveToPidlBind(FileName, Folder);
end;
end;
PidlFree(PathIdList);
end
else Result:=DriveToPidlBind(FileName, Folder);
end;
end;

最佳答案

COM 接口(interface)是引用计数的,Delphi 编译器会生成代码来自动为您管理引用计数。每次分配接口(interface)变量时,Release如果变量不为零,则调用 AddRef如果新值不为零,则调用。当变量超出范围时,Release如果不是 nil 则调用。

所以按照你的方式手动释放是错误的。您手动释放了接口(interface),然后编译器尝试自动释放它。您必须让编译器完成工作。

如果您确实希望在接口(interface)超出范围之前释放它,请分配 nil对它:

DesktopFolder := nil;

但在本例中,您无需这样做。

Delphi 设计者不希望您明确调用 AddRefRelease ,所以他们命名为 _AddRef_Release为了阻止您直接调用这些方法。

关于delphi - 需要释放 SHGetDesktopFolder 返回的 IShellFolder 接口(interface)吗?如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30833303/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com