0

私は自分のアプリケーションでかなり異常な作業をしています。次のコードを使用して、すべての名前空間といくつかのルート名前空間を列挙しています。たとえば、Nethood の作業は非常に遅く、読み込みに 1 分以上かかります (!!)。これは 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の の外部で非同期の変更通知を監視していることを単に通知するだけなので、アイテムが実際に追加/削除/変更されたときに変更通知によって通知されるため、列挙は一度にすべてを返す必要はありません。時間。IShellFolderSHChangeNotifyRegister()

于 2012-06-05T01:39:28.220 に答える