2012-03-27 8 views
0

私はC++シェル拡張dllを持っています。 メソッドの初期化は、エクスプローラウィンドウの左ペインのツリービューフォルダをクリックすると2回呼び出されます。しかし、エクスプローラウィンドウの右ペインで任意のフォルダをクリックすると、Initializeメソッドが一度呼び出されます。Windows 7 - シェル拡張dllエクスプローラの左ペインで2回呼び出される初期化メソッド

左ペインのツリービューをクリックすると、新しく追加されたメニュー項目がコンテキストメニューに2回表示されるという問題があります。

私は窓の機能ですか? 私は以下のコードですべての私の実装をコメントしてテストした:私は左ペインをクリックすると

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; 
} 

、DebugViewr出力は次のとおりです。

初期

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}' 
     } 
    } 
} 

上記のレジストリエントリはWindows 7でこの問題を引き起こしています。「NoRemove Background」を削除すると、コンテキストメニューがツリービューで1回表示されます。しかし、空の領域をクリックするとInitializeメソッドが呼び出されません。

+0

私はあなたのコンテキストメニューシェル拡張について話していると仮定します。もしそうなら、それは間違いなく正しいWindowsの機能です。いくつかのコードを投稿できますか? – Flot2011

+0

初期化(LPCITEMIDLIST pidlFolder、LPDATAOBJECT pDO、HKEY/* hkeyProgID * /)。私はこの方法でメニューの母集団をやっています。この関数にログメッセージを追加しました。初期化メソッドのように2回呼び出します。 – kanden

+0

署名だけでなく、コードを投稿できますか?さもなければそれはちょうど推測ゲームです。 – Flot2011

答えて

0

実際のプログラム(明確にするためにアプリケーション固有のコードは省略されています)から実際のサンプルを投稿しています。試してみてください。

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

Flot2011に感謝、あなたのコードを実装しようとします – kanden

+0

私はあなたのコードを実装している、初期化メソッドが2回呼び出されます。しかし、QueryContextMenuは – kanden

+0

を呼び出さなかった問題はWindows 7でのみ発生しています – kanden

関連する問題