gpt4 book ai didi

delphi - 带有异步 EnumObject 的 IShellFolder (SHCONTF_ENABLE_ASYNC)

转载 作者:行者123 更新时间:2023-12-04 17:04:42 25 4
gpt4 key购买 nike

我在我的应用程序中有非常不正常的工作。我正在使用以下代码枚举所有命名空间和一些根命名空间 - 例如 Nethood 工作非常慢 - 加载超过一分钟(!!)这仅在 Win7 上发生,在较旧的系统上加载是可以的。

我正在使用 MustangPeak 库中的这个函数:

function TNamespace.EnumerateFolder(MessageWnd: HWnd; Folders, NonFolders,
IncludeHidden: Boolean; EnumFunc: TEnumFolderCallback;
UserData: Pointer): integer;
var
Enum: IEnumIDList;
Flags: Longword;
Fetched: Longword;
Item: PItemIDList;
Terminate: Boolean;
OldError: integer;
OldWow64: Pointer;
begin
Result := 0;

OldError := SetErrorMode(SEM_FAILCRITICALERRORS or SEM_NOOPENFILEERRORBOX);
try
if Assigned(ShellFolder) then
begin
if Assigned(EnumFunc) then
begin
Terminate := False;
Flags := 0;
if Folders then
Flags := Flags or SHCONTF_FOLDERS;
if NonFolders then
Flags := Flags or SHCONTF_NONFOLDERS;
if IncludeHidden then
Flags := Flags or SHCONTF_INCLUDEHIDDEN;

// --- This is new added
Flags := Flags or SHCONTF_ENABLE_ASYNC;

if Valid then
begin
OldWow64 := Wow64RedirectDisable;
try

if ShellFolder.EnumObjects(MessageWnd, Flags, Enum) = NOERROR then
begin
// Vista Enum is nil every once in a while
if Assigned(Enum) then
begin
while (Enum.Next(1, Item, Fetched) = NOERROR) and not Terminate do
begin
if EnumFunc(MessageWnd, Item, Self, UserData, Terminate) then
Inc(Result)
end
end
end
finally
Wow64RedirectRevert(OldWow64)
end
end
end
end
finally
SetErrorMode(OldError);
end
end;

现在我在 MSDN 文档中读到在 Win7 中支持新的异步标志,以便立即获得结果,然后在系统读取时接收其他结果。

该标志称为 SHCONTF_ENABLE_ASYNC,我将它添加到我用 (//--- 这是新添加的) 标记的地方的代码中

问题是因为我不知道如何在收到更新时捕获事件。

如何 Hook 新收到的元素?是否有系统(对象)发送到某个控件或结构等的某些事件(消息等)?

谢谢!

最佳答案

SHCONTF_ENABLE_ASYNC不会使枚举本身异步。它只是让 IShellFolder知道您正在监视 IShellFolder 之外的异步更改通知,例如 SHChangeNotifyRegister() ,因此枚举不需要一次返回所有内容,因为更改通知将在实时添加/删除/更改项目时通知您。

关于delphi - 带有异步 EnumObject 的 IShellFolder (SHCONTF_ENABLE_ASYNC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10890361/

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