2015-05-18 6 views
1

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

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

Например, перейдя в

C:\root\folder\subfolder 

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

C:\root 

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

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

Я пробовал ProcMon и DbgView с номером sysinternals, не нашел подходящих данных.

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

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

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

Любые предложения?

+0

Учитывая ваши предыдущие вопросы о NSE, я думаю, ваш код имеет проблемы с созданием PIDL. Неправильная структура PIDL может быть причиной такого поведения. –

+0

Я использую старый код устаревшего кода для PIDL, хотя из наших предыдущих разговоров я не мог обнаружить никаких проблем с ним. Любая ссылка о том, как правильно создать PIDL? – Mugen

+0

MSDN: https://msdn.microsoft.com/library/windows/desktop/bb773321%28v=vs.85%29.aspx/ https://msdn.microsoft.com/en-us/library/windows/ Рабочий стол/cc144090% 28v = vs.85% 29.aspx # ID_Lists_PIDL –

ответ

2

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

В моей NSE я использую протоколирование. Я вижу КАЖДЫЙ вызов функции EVERY моей 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; 

И журналы выглядеть следующим образом:

Logs

И журналы помог мне много раз, чтобы найти проблемы в своем коде.

Смежные вопросы