c++ - 替换 SHDOLCC.DLL 文件以自定义 Web 浏览器的上下文菜单

标签 c++ windows webbrowser-control

我正在使用此代码 article自定义网络浏览器的上下文菜单。

但是当我运行这段代码时

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

出现此错误

“找不到指定的模块”

我在我的系统(Windows 7 x64、IE9)上搜索,但没有找到 SHDOLCC.DLL 文件,问题是在较新版本的 IE 中是否存在此文件的替代品,否则我必须使用另一种方式加载上下文菜单并自定义它?

最佳答案

您不应再使用或依赖 Internet Explorer 的内部资源。正如您指出的文章中所述:

In Internet Explorer 7, the technique for overriding the context menu from a DocObject host is the same as Internet Explorer 6; however, the host must implement its own menu resources. The internal resources of Internet Explorer should not be used as they may change or move (as has been done in Internet Explorer 7).

关于c++ - 替换 SHDOLCC.DLL 文件以自定义 Web 浏览器的上下文菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9773645/

相关文章:

javascript - 在 WebBrowser 控件中从 .NET Compact Framework 调用 JavaScript 函数

.net - WebView2 控件中的打印功能

C++ - 二进制表达式的无效操作数

c++ - 类模板中的重载运算符> friend

windows - 从临时文件夹运行签名和 RequireAdministrator 可执行文件?

windows - 反引号放置为何重要?

wpf - 在 WPF 框架上设置 ScrollViewer(用于垂直滚动)的正确方法?

c++ - QT Qvtkwidget。交互方式改变

c++ - 在线判断平台中的全局数组堆内存分配

python - 无法使用 easy_install 安装 DjangoSEO