我的应用程序中的工作非常不正常。我正在使用以下代码来枚举所有名称空间和一些根名称空间 - 例如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中支持新的async标志,以便立即获得结果,然后在系统读取时接收其他结果。
该标志名为SHCONTF_ENABLE_ASYNC,我将其添加到我标有的地方的代码中(// ---这是新添加的)
问题是因为我不知道如何在收到更新时捕获事件。
如何挂钩新收到的物品?是否存在系统(对象)发送到某个控件或结构等的事件(消息等)。
谢谢!
答案 0 :(得分:1)
SHCONTF_ENABLE_ASYNC
不会使枚举本身异步。它只是让IShellFolder
知道您正在监视IShellFolder
之外的异步更改通知,例如SHChangeNotifyRegister()
,因此枚举不需要一次返回所有内容作为更改通知会在实时添加/删除/更改项目时通知您。