2012-03-27 10 views
0

Ich habe eine C++ Shell-Erweiterung dll. Die Initialize Methode wird zweimal aufgerufen, wenn ich auf die Explorer-Fenster linken Fensterbaumansichtsordner klicke. Wenn ich jedoch im rechten Fensterbereich des Explorerfensters auf einen Ordner klicke, wird die Initialize-Methode einmal aufgerufen.Windows 7 - Shell Extension dll Initialize-Methode aufgerufen zweimal im Explorer linken Bereich

Das Problem ist meine neu hinzugefügte Menüpunkte zweimal im Kontextmenü zeigt, wenn ich dann auf der linken Baumansicht klicken.

Ich frage mich, ist es eine Fensterfunktion? Ich habe alle meine Implementierung und getestet mit dem folgenden Code kommentiert:

IFACEMETHODIMP CMyContextMenu::QueryContextMenu(HMENU hmenu, UINT /*uIndex*/, UINT cmdFirst, UINT /*uidCmdLast*/, UINT /*uFlags*/) 
{ 
UINT cmdId = uidCmdFirst; 
OutputDebugString(L"QueryContextMenu"); 

    return MAKE_HRESULT (SEVERITY_SUCCESS, FACILITY_NULL, cmdId - mdFirst); 
} 


IFACEMETHODIMP CMyContextMenu::Initialize(LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDO, HKEY /*hkeyProgID*/) 
{ 
OutputDebugString(L"Initialize"); 
return S_OK; 
} 

Wenn ich auf linken Bereich klicken, wird der DebugViewr Ausgabe lautet:

initialisieren

QueryContextMenu

initialisieren

QueryContextMenu

NoRemove Directory 
{ 
    NoRemove Background 
    { 
     NoRemove ShellEx 
     { 
      NoRemove ContextMenuHandlers 
      { 
       ForceRemove myContext = s '{AE843198-3C5D-4EA6-B74F-7A41FC91D7FF}' 
      } 
     } 
    } 
} 

NoRemove Directory 
{ 
    NoRemove ShellEx 
    { 
     NoRemove ContextMenuHandlers 
     { 
      ForceRemove myContext = s '{AE843198-3C5D-4EA6-B74F-7A41FC91D7FF}' 
     } 
    } 
} 

Der obige Registrierungseintrag verursacht dieses Problem in Win 7, Wenn ich „NoRemove Hintergrund“ entfernen, wird das Kontextmenü einmal in der Baumansicht angezeigt. Aber wenn ich auf Ordner leeren Bereich klicke, wird die Initialize-Methode nicht aufgerufen.

+0

Ich nehme an, Sie über ein Kontextmenü Shell-Erweiterung sprechen. Wenn ja, ist es definitiv keine korrekte Windows-Funktionalität. Kannst du etwas Code posten? – Flot2011

+0

Initialisieren (LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDO, HKEY/* hkeyProgID * /). Ich mache meine Menüpopulation in dieser Methode. Ich habe log message in dieser Funktion hinzugefügt und es sieht aus wie Initialisierungsmethode, die zweimal aufruft. – kanden

+0

Können Sie bitte den Code und nicht nur die Signatur posten? Ansonsten ist es nur ein Ratespiel. – Flot2011

Antwort

0

Ich poste ein funktionierendes Beispiel aus meinem realen Programm (ein anwendungsspezifischer Code wurde aus Gründen der Klarheit weggelassen). Versuch es bitte.

STDMETHODIMP CShlExtExample::Initialize (
LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hProgID) 
{ 
FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; 
STGMEDIUM stg = { TYMED_HGLOBAL }; 
HDROP  hDrop; 

    // Look for CF_HDROP data in the data object. 
    if (FAILED(pDataObj->GetData (&fmt, &stg))) 
    { 
     // Return an "invalid argument" error. 
     return E_INVALIDARG; 
    } 

    // Get a pointer to the actual data. 
    hDrop = (HDROP) GlobalLock (stg.hGlobal); 
    if (NULL == hDrop) 
     return E_INVALIDARG; 

    // Make sure there is at least one file to show menu for. 
    UINT uNumFiles = DragQueryFile (hDrop, 0xFFFFFFFF, NULL, 0); 
    HRESULT hr = S_OK; 
    if (0 == uNumFiles) 
    { 
     GlobalUnlock (stg.hGlobal); 
     ReleaseStgMedium (&stg); 
     return E_INVALIDARG; 
    } 

    // Application specific code. 

    GlobalUnlock (stg.hGlobal); 
    ReleaseStgMedium (&stg); 

    return hr; 

}

STDMETHODIMP CShlExtExample::QueryContextMenu (
    HMENU hmenu, UINT uMenuIndex, UINT uidFirstCmd, 
    UINT uidLastCmd, UINT uFlags) 
    { 
    // If the flags include CMF_DEFAULTONLY then do nothing. 
    if (uFlags & CMF_DEFAULTONLY) 
     return MAKE_HRESULT (SEVERITY_SUCCESS, FACILITY_NULL, 0); 

    InsertMenu (hmenu, uMenuIndex, MF_BYPOSITION, uidFirstCmd, _T("Test Item")); 

    return MAKE_HRESULT (SEVERITY_SUCCESS, FACILITY_NULL, 1); 
    } 
+0

danke Flot2011, ich werde versuchen, Ihren Code zu implementieren – kanden

+0

Ich habe Ihren Code implementiert, Initialize-Methode wird zweimal aufgerufen. Aber QueryContextMenu nie – kanden

+0

Das Problem tritt nur in Windows 7 auf – kanden