Aashish Chavan Ответов: 1

Может ли кто-нибудь помочь мне с эквивалентным кодом C++?


[ClassInterface(ClassInterfaceType.None), ComVisible(true), Guid("8a194578-81ea-4850-9911-13ba2d71efbd")]
    public class BrowserHelperObject : IObjectWithSite
    {
        private WebBrowser webBrowser;
        private HTMLDocument document;
        public static string BHOKEYNAME = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Browser Helper Objects";
        public void OnDocumentComplete(object pDisp, ref object URL)
        {
            this.document = (HTMLDocument)this.webBrowser.Document;
            Marshal.ReleaseComObject(this.document);
        }
        [ComRegisterFunction]
        public static void RegisterBHO(Type type)
        {
            RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(BrowserHelperObject.BHOKEYNAME, RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl);
            if (registryKey == null)
            {
                registryKey = Registry.LocalMachine.CreateSubKey(BrowserHelperObject.BHOKEYNAME);
            }
            string guid = type.GUID.ToString("B");
            RegistryKey ourKey = registryKey.OpenSubKey(guid, true);
            if (ourKey == null)
            {
                ourKey = registryKey.CreateSubKey(guid);
            }
            ourKey.SetValue("IEAddinApplied", 1, RegistryValueKind.DWord);
            registryKey.Close();
            ourKey.Close();
        }
        [ComUnregisterFunction]
        public static void UnregisterBHO(Type type)
        {
            RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(BrowserHelperObject.BHOKEYNAME, RegistryKeyPermissionCheck.ReadWriteSubTree, System.Security.AccessControl.RegistryRights.FullControl);
            string guid = type.GUID.ToString("B");
            if (registryKey != null)
            {
                registryKey.DeleteSubKey(guid, false);
            }
        }
        public int SetSite(object site)
        {
            if (site != null)
            {
                this.webBrowser = (WebBrowser)site;
                this.webBrowser.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
            }
            else
            {
                this.webBrowser.DocumentComplete -= new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
                Marshal.ReleaseComObject(this.document);
                this.webBrowser = null;
            }
            return 0;
        }
        public int GetSite(ref Guid guid, out IntPtr ppvSite)
        {
            IntPtr punk = Marshal.GetIUnknownForObject(this.webBrowser);
            int hr = Marshal.QueryInterface(punk, ref guid, out ppvSite);
            Marshal.Release(punk);
            return hr;
        }


Что я уже пробовал:

Проблема, с которой я столкнулся, заключается в следующем
OnDocumentComplete
Метод и с этой частью кода
if (site != null)
            {
                this.webBrowser = (WebBrowser)site;
                this.webBrowser.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
            }
            else
            {
                this.webBrowser.DocumentComplete -= new DWebBrowserEvents2_DocumentCompleteEventHandler(this.OnDocumentComplete);
                Marshal.ReleaseComObject(this.document);
                this.webBrowser = null;
            }


Также я хочу сослаться shdocvw.dll и мштмл.DLL в проект c++

KarstenK

Ответ Йохена верен, но это трудная задача даже для опытного COM-программиста. Так что будьте осторожны, и вам понадобится много времени!!!

Совет: для лучшей отладки вам следует отключить некоторые параметры безопасности.

1 Ответов

Рейтинг:
2

Jochen Arndt

Класс интерфейса:
Класс IObjectWithSiteImpl | Microsoft Docs[^]

Он содержит код, показывающий, как реализовать интерфейс и приемники событий:
Написание BHO на простом языке C++[^]

Цитата:
Также я хочу сослаться shdocvw.dll и мштмл.DLL в проект c++
Просто добавьте их в настройки проекта (Linker - Input - дополнительные зависимости) или укажите в одном исходном файле с помощью комментарий (C/C++) | Microsoft Docs[^] :
#pragma comment(lib, "shdocvw.lib")
#pragma comment(lib, "mshtml.lib")


Aashish Chavan

public void OnDocumentComplete(object pDisp, ref object URL)
{
это.документ = (htmldocument на)этом.объект WebBrowser.Документ;
Маршал.Метода releasecomobject(это.документ);
}

public int SetSite(объект сайта)
{
if (site != null)
{
этот.объект WebBrowser = - сайта (веб-браузер);
этот.объект WebBrowser.DocumentComplete += new DWebBrowserEvents2_DocumentCompleteeventhandler(this.OnDocumentComplete);
}
еще
{
этот.объект WebBrowser.DocumentComplete -= new DWebBrowserEvents2_DocumentCompleteeventhandler(this.OnDocumentComplete);
Маршал.Метода releasecomobject(это.документ);
этот.объект WebBrowser = нуль;
}
возвращает 0;
}

Пожалуйста, помогите мне с этим кодом на C++

Jochen Arndt

Он не может быть непосредственно переведен на C++.

Вы должны реализовать интерфейс и приемники событий, как описано в статье CP из моего решения.

В статье приводится реализация проекта. Так что вам повезло, и вам не придется делать это самостоятельно, потому что - как уже отметил Карстенк в своем комментарии - реализация таких COM-интерфейсов и приемников является продвинутой и сложной задачей.

Однако, если вам нужно изменить код статьи в соответствии с вашими потребностями (что, я думаю, необходимо), вы должны были прочитать о COM-интерфейсах с C++ / MFC раньше и понять, по крайней мере, основы.