Re[2]: Программно разрешить исполнение ActiveX в CWebBrowser
От: vodopad  
Дата: 24.05.06 08:46
Оценка:
Здравствуйте, algol, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>Когда я загружаю html страницу со своими activex(без подписи) в CWebBrowser2, у меня выскакивает окно и предлагается разрешить выполнение activex.

А>>Можно ли сделать так чтобы в моем CWebBrowser2 всегда разрешалось выполнение activex без всяких окон или придется возиться с подписью activex?

A>Здесь наверное проблема не в отсутствии подписи, а в том, что контрол не помечен как safe for scripting and initialization. Если используется ATL, то см. класс IObjectSafetyImpl.


Спасибо за наводку так и оказалось вот ссылка http://support.microsoft.com/?scid=http%3a%2f%2fwww.support.microsoft.com%2fkb%2f161873%2f для решения через реестр. У меня activex сделан с помощью MFC, и я сделал через реализацию IObjectSafety (посмотрел http://www.vbnet.ru/forum/show.aspx?id=23771)

если в двух словах, то добавить в .h
#include <Objsafe.h>

class C2Ctrl : public COleControl
{
DECLARE_DYNCREATE(C2Ctrl)
private:
enum SafetyOptions {
SupportedScriptingOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER,
SupportedInitOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA
};


SafetyOptions m_supportedScriptingOptions;
SafetyOptions m_supportedInitOptions;
bool m_enabledScriptingOptions;
bool m_enabledInitOptions;
...

BEGIN_INTERFACE_PART(MySafetyObj, IObjectSafety)
INIT_INTERFACE_PART(CSafeCtrl, MySafetyObj)
STDMETHOD(GetInterfaceSafetyOptions)(REFIID, DWORD*, DWORD*);
STDMETHOD(SetInterfaceSafetyOptions)(REFIID, DWORD, DWORD);
END_INTERFACE_PART(MySafetyObj)
DECLARE_INTERFACE_MAP()
}

и сделал в .cpp реализацию
//---------------------------------------------------------------------------
в конструктор
C2Ctrl::C2Ctrl()
{
m_supportedScriptingOptions=SupportedScriptingOptions;
m_supportedInitOptions=SupportedInitOptions;
m_enabledScriptingOptions=0;
m_enabledInitOptions=0;
...
}
//---------------------------------------------------------------------------
//Safety

STDMETHODIMP_(ULONG) C2Ctrl::XMySafetyObj::AddRef( )
{
METHOD_MANAGE_STATE(C2Ctrl, MySafetyObj)
ASSERT_VALID(pThis);
return pThis->ExternalAddRef();
}

//---------------------------------------------------------------------------

STDMETHODIMP_(ULONG) C2Ctrl::XMySafetyObj::Release( )
{
METHOD_MANAGE_STATE(C2Ctrl, MySafetyObj)
ASSERT_VALID(pThis);
return pThis->ExternalRelease();
}

//---------------------------------------------------------------------------

STDMETHODIMP C2Ctrl::XMySafetyObj::QueryInterface(REFIID iid,LPVOID FAR* ppvObj)
{
METHOD_MANAGE_STATE(C2Ctrl, MySafetyObj)
ASSERT_VALID(pThis);
return pThis->ExternalQueryInterface((void *)&iid, ppvObj);
}

//---------------------------------------------------------------------------

STDMETHODIMP C2Ctrl::XMySafetyObj::GetInterfaceSafetyOptions(REFIID riid, DWORD __RPC_FAR *pdwSupportedOptions,DWORD __RPC_FAR *pdwEnabledOptions)
{
METHOD_PROLOGUE(C2Ctrl, MySafetyObj)
ASSERT_VALID(pThis);
if (!pdwSupportedOptions || !pdwEnabledOptions)
return E_POINTER;
if (riid == IID_IDispatch)
{
*pdwSupportedOptions = pThis->m_supportedScriptingOptions;
*pdwEnabledOptions = pThis->m_enabledScriptingOptions;
return S_OK;
}
else if (riid == IID_IPersistPropertyBag)
{
*pdwSupportedOptions = pThis->m_supportedInitOptions;
*pdwEnabledOptions = pThis->m_enabledInitOptions;
return S_OK;
}
else if (TRUE)
{
*pdwSupportedOptions = *pdwEnabledOptions = 0;
return E_FAIL;
}
else return E_NOINTERFACE;
}

//---------------------------------------------------------------------------

STDMETHODIMP C2Ctrl::XMySafetyObj::SetInterfaceSafetyOptions(REFIID riid,DWORD dwOptionSetMask, DWORD dwEnabledOptions)
{
METHOD_MANAGE_STATE(C2Ctrl, MySafetyObj)
ASSERT_VALID(pThis);
if (riid == IID_IDispatch)
{
if ((dwOptionSetMask & pThis->m_supportedScriptingOptions) == dwOptionSetMask)
{
DWORD dwNewOptions = dwOptionSetMask & dwEnabledOptions;
pThis->m_enabledScriptingOptions = (pThis->m_enabledScriptingOptions &
~dwOptionSetMask) | dwNewOptions;
return S_OK;
}
else return E_FAIL;//return S_OK;
}
else if (riid == IID_IPersistPropertyBag)
{
if ((dwOptionSetMask & pThis->m_supportedInitOptions) == dwOptionSetMask)
{
DWORD dwNewOptions = dwOptionSetMask & dwEnabledOptions;
pThis->m_enabledInitOptions = (pThis->m_enabledInitOptions &
~dwOptionSetMask) | dwNewOptions;
return S_OK;
}
else return E_FAIL;//return S_OK;
}
else if (TRUE) return E_FAIL;
else return E_NOINTERFACE;
}

//---------------------------------------------------------------------------
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.