0

我在我的应用程序中有相当不正常的工作。我正在使用以下代码来枚举所有命名空间和一些根命名空间 - 例如 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 并且我将它添加到我标记的地方的代码中(// --- 这是新添加的)

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

如何挂钩新收到的物品?是否存在系统(对象)发送到某个控件或结构等的某些事件(消息等)?

谢谢!

4

1 回答 1

1

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

于 2012-06-05T01:39:28.220 回答