Замена файла SHDOCLC.DLL для настройки контекстного меню веб-браузера - PullRequest
2 голосов
/ 19 марта 2012

Я использую код из этой статьи для настройки контекстного меню веб-браузера.

, но когда я запускаю этот код

HRESULT CBrowserHost::ShowContextMenu(DWORD dwID,
                                     POINT *ppt,
                                     IUnknown *pcmdTarget,
                                     IDispatch *pdispObject) 
{
   #define IDR_BROWSE_CONTEXT_MENU  24641
   #define SHDVID_GETMIMECSETMENU   27
   #define SHDVID_ADDMENUEXTENSIONS 53

   HRESULT hr;
   HINSTANCE hinstSHDOCLC;
   HWND hwnd;
   HMENU hMenu;
   CComPtr<IOleCommandTarget> spCT;
   CComPtr<IOleWindow> spWnd;
   MENUITEMINFO mii = {0};
   CComVariant var, var1, var2;

   hr = pcmdTarget->QueryInterface(IID_IOleCommandTarget, (void**)&spCT);
   hr = pcmdTarget->QueryInterface(IID_IOleWindow, (void**)&spWnd);
   hr = spWnd->GetWindow(&hwnd);

   hinstSHDOCLC = LoadLibrary(TEXT("SHDOCLC.DLL")); //here the exception is raised

   if (hinstSHDOCLC == NULL)
   {
       // Error loading module -- fail as securely as possible.
       return;
   }

   hMenu = LoadMenu(hinstSHDOCLC,
                    MAKEINTRESOURCE(IDR_BROWSE_CONTEXT_MENU));

   hMenu = GetSubMenu(hMenu, dwID);

   // Get the language submenu.
   hr = spCT->Exec(&CGID_ShellDocView, SHDVID_GETMIMECSETMENU, 0, NULL, &var);

   mii.cbSize = sizeof(mii);
   mii.fMask  = MIIM_SUBMENU;
   mii.hSubMenu = (HMENU) var.byref;

   // Add language submenu to Encoding context item.
   SetMenuItemInfo(hMenu, IDM_LANGUAGE, FALSE, &mii);

   // Insert Shortcut Menu Extensions from registry.
   V_VT(&var1) = VT_INT_PTR;
   V_BYREF(&var1) = hMenu;

   V_VT(&var2) = VT_I4;
   V_I4(&var2) = dwID;

   hr = spCT->Exec(&CGID_ShellDocView, SHDVID_ADDMENUEXTENSIONS, 0, &var1, &var2);

   // Remove View Source.
   DeleteMenu(hMenu, IDM_VIEWSOURCE, MF_BYCOMMAND);

   // Show shortcut menu.
   int iSelection = ::TrackPopupMenu(hMenu,
                                     TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD,
                                     ppt->x,
                                     ppt->y,
                                     0,
                                     hwnd,
                                     (RECT*)NULL);

   // Send selected shortcut menu item command to shell.
   LRESULT lr = ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL);

   FreeLibrary(hinstSHDOCLC);
   return S_OK;
}

Этовозникает ошибка

"The specified module could not be found"

Я ищу в своей системе (Windows 7 x64, IE9) и не нашел файл SHDOCLC.DLL, вопрос в том, существует ли какая-либо замена для этого файла вболее новые версии IE или я должен использовать другой способ загрузить контекстное меню и настроить его?

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

Вы больше не должны использовать или полагаться на внутренние ресурсы Internet Explorer.Как указано в статье, которую вы указали:

В Internet Explorer 7 метод переопределения контекстного меню с хоста DocObject такой же, как и в Internet Explorer 6;однако хост должен реализовать свои собственные ресурсы меню.Внутренние ресурсы Internet Explorer не должны использоваться, поскольку они могут изменяться или перемещаться (как это было сделано в Internet Explorer 7).

1 голос
/ 16 июля 2013

, если версия Windows новее, чем VISTA (входит в комплект), попробуйте вместо этого использовать LoadLibrary ("IEFRAME.DLL").

И вы можете найти больше информации здесь

...