Проводник перемещается в корневую папку моего расширения пространства имен
В моем расширении пространства имен у меня есть папки, которые на самом деле не существуют в файловой системе.
Иногда, просматривая мое расширение пространства имен, 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;
И логи выглядят так:
И журналы много раз помогали мне находить проблемы в моем коде.