Как создать кнопку в IE
От: Vit1251 Россия  
Дата: 17.03.05 15:18
Оценка:
Очень хотелось бы создать свой плугин который висел бы как кнопка в IE и при нажатии выдавал бы MsgBox(URL); Естетвенно MsgBox я заменю на свой плугин... Если кто писал... Плз поделитесь...
Re: Как создать кнопку в IE
От: Flamer Кипр http://users.livejournal.com/_flamer_/
Дата: 18.03.05 01:38
Оценка: 15 (1)
Здравствуйте, Vit1251, Вы писали:

V>Очень хотелось бы создать свой плугин который висел бы как кнопка в IE и при нажатии выдавал бы MsgBox(URL); Естетвенно MsgBox я заменю на свой плугин... Если кто писал... Плз поделитесь...


Там ничего сложного нету: создаешь COM-объект вот с такими интерфейсами (CIEButton — это для сэмпла, надо реализовать, собственно, IOleCommandTarget и IObjectWithSite):

class ATL_NO_VTABLE CIEButton : 
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CIEButton, &CLSID_IEButton>,
    public IOleCommandTarget,
    public IObjectWithSite,
    public IIEButton
{
private:
    IUnknown* pSomething;

public:
    CIEButton()
    {
        pSomething = NULL;
    }

DECLARE_REGISTRY_RESOURCEID(IDR_IEBUTTON)

public:
    STDMETHOD(QueryStatus)(const GUID *pCmdGroup, ULONG cCmds, OLECMD prgCmds[],
                            OLECMDTEXT *pCmdText);
    STDMETHOD(Exec)(const GUID *pCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt,
                        VARIANTARG *pvaIn, VARIANTARG *pvaOut);

public:
    STDMETHOD(SetSite)(IUnknown *pUnkSite);
    STDMETHOD(GetSite)(REFIID riid, void **ppvSite);


BEGIN_COM_MAP(CIEButton)
    COM_INTERFACE_ENTRY(IIEButton)
    COM_INTERFACE_ENTRY(IOleCommandTarget)
    COM_INTERFACE_ENTRY(IObjectWithSite)
END_COM_MAP()


    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    {
        return S_OK;
    }
    
    void FinalRelease() 
    {
    }

public:

};

OBJECT_ENTRY_AUTO(__uuidof(IEButton), CIEButton)


Пишешь код COM'ика:

STDMETHODIMP CIEButton::QueryStatus(const GUID *pCmdGroup, ULONG cCmds,
OLECMD prgCmds[], OLECMDTEXT *pCmdText)
{
    if (!prgCmds)
        return E_POINTER;

    if (!cCmds)
        return E_UNEXPECTED;


    for(UINT i=0;i<cCmds;i++)
       prgCmds[i].cmdf = OLECMDF_ENABLED;

return S_OK;
}
//---------------------------------------------------------------------------
STDMETHODIMP CIEButton::Exec(const GUID *pCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt,
                                  VARIANTARG *pvaIn, VARIANTARG *pvaOut)
{

::MessageBox(NULL,"Clicked on button!",NULL,MB_OK);

return S_OK;
}
//---------------------------------------------------------------------------
STDMETHODIMP CIEButton::SetSite(IUnknown *pUnkSite)
{
pSomething =  pUnkSite;
return S_OK;
}
//---------------------------------------------------------------------------
STDMETHODIMP CIEButton::GetSite(REFIID riid, void **ppvSite)
{
if(!pSomething)
  {
  *ppvSite = NULL;
  return E_FAIL;
  }
return pSomething->QueryInterface(riid, ppvSite);
}
//---------------------------------------------------------------------------


И регистрируешь его:

HKLM
{
    NoRemove Software
    {
        NoRemove Microsoft
        {
            NoRemove 'Internet Explorer'
            {
                NoRemove Extensions
                {
                    ForceRemove '{CLSID объекта}'
                    {
                        val ButtonText = s 'Текст кнопки'
                        val MenuText = s 'Текст меню'
                        val MenuStatusBar = s 'Текст в статусе'
                        
                        val CLSID = s '{1FBA04EE-3024-11D2-8F1F-0000F87ABD16}'
                        val ClsidExtension = s '{CLSID объекта}'
                        
                        val 'Default Visible' = s 'Yes'
                        val HotIcon = s '%MODULE%,1' // индекс иконки в файле dll
                        val Icon = s '%MODULE%,1' // индекс иконки в файле dll
                        
                    }
                }
            }
        }
    }
}


Вот и всего делов-то
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.