Проводник перемещается в корневую папку моего расширения пространства имен

В моем расширении пространства имен у меня есть папки, которые на самом деле не существуют в файловой системе.

Иногда, просматривая мое расширение пространства имен, Explorer просто перенаправляет пользователя обратно в корневую папку.

Например, переход к

C:\root\folder\subfolder

Я перенаправлен обратно в

C:\root

Это происходит в неясных сценариях, но продолжает воспроизводить.

Я пытаюсь отладить его и определить, что мешает с Explorer, но я не могу найти правильный инструмент.

я пробовал ProcMon а также DbgView из sysinternals, но не смог найти соответствующие данные.

Я добавил следы на любые явные звонки, которые я делаю ShchangeNotify, но ни один из них не выполняется в соответствующее время.

Я также пытался добавить следы к моей реализации IShellFolderViewCB.MessageSFVCB(), Опять же, журналы не напечатаны в соответствующих временных метках.

Я предполагаю, что никто не сможет помочь моему делу без дополнительной информации, но это относится и ко мне. Мне нужен какой-то лучший инструмент, чтобы ловить события проводника и определять, что идет не так.

Какие-либо предложения?

1 ответ

Это не ответ. Это только совет.

В моем NSE я использую логирование. Я вижу КАЖДЫЙ вызов каждой функции моего NSE в реальном времени. Я вижу все и все параметры. Каждая функция в моих источниках выглядит так:

function TdecShellNamespaceFolder.IShellFolder_ParseDisplayName(AWnd: HWND; ABindCtx: Pointer; ADisplayName: POLESTR; out AEaten: ULONG; out AItemIDList: PItemIDList; var AAttributes: ULONG): HRESULT;
var
  {$IFDEF USE_LOGS}
  CurrentMethod: string;
  {$ENDIF}
  Eaten: DWORD;
  Attr: TdecFileShellAttributes;
begin
  {$IFDEF USE_LOGS}
  CurrentMethod := 'IShellFolder.ParseDisplayName';
  LogSendEnter(CurrentMethod);
  LogSendInHWND(CurrentMethod, 'AOwner', AWnd);
  LogSendInBindCtx(CurrentMethod, 'ABindCtx', IBindCtx(ABindCtx));
  LogSendInParam(CurrentMethod, 'ADisplayName', ADisplayName);
  LogSendInNil(CurrentMethod, '@AEaten', @AEaten);
  LogSendInNil(CurrentMethod, '@AItemIDList', @AItemIDList);
  if Assigned(@AAttributes) then
    LogSendInParam(CurrentMethod, 'AAttributes', SFGAOToString(AAttributes))
  else
    LogSendInNil(CurrentMethod, '@AAttributes');
  Result := E_FAIL;
  try
  {$ENDIF}
    try
      // FUNCTION BODY
    except
      on E: Exception do
        begin
          {$IFDEF USE_LOGS}
          LogSendException(CurrentMethod, E);
          {$ENDIF}
          Result := HResultFromException(E);
        end;
    end;
  {$IFDEF USE_LOGS}
  finally
    if Result = S_OK then
      begin
        if Assigned(@AEaten) then
          LogSendOutParam(CurrentMethod, 'AEaten', IntToStr(AEaten));
        LogSendOutItemIDList(CurrentMethod, 'AItemIDList', AItemIDList);
        if Assigned(@AAttributes) then
          LogSendOutParam(CurrentMethod, 'AAttributes', SFGAOToString(AAttributes));
      end;
    LogSendResult(CurrentMethod, Result);
    LogSendExit(CurrentMethod);
  end;
  {$ENDIF}
end;

И логи выглядят так:

бревна

И журналы много раз помогали мне находить проблемы в моем коде.

Другие вопросы по тегам