Страница: 1 |
при размещении ActiveX на html-страничке запрашивается подверждение на передачу контролу параметров. Чтобы подавить это требуется разрешить запуск ActiveX не помеченных как безопасные. Как избежать этого? Когда создавал контрол, то указал: "Safe for initialisation=yes, Safe for scripting=yes". Но это как дохлому припарка... Самое интересное то, что есть пример IObjSafety в котором создается контрол нормально работающий. В нем используется класс IObjSafety. Но вот повторить этот пример с нуля не получается...
То, что ты указал "Safe for initialisation=yes, Safe for scripting=yes" в пакете установки, это будет работать только инструкция для инсталляции OCX. В реестре нужно добавить два ключа: HKLM,"SOFTWARE\Classes\CLSID\{Твой контлол}\Implemented Categories\{7DD95801-9882-11CF-9FA9-00AA006C42C4}" HKLM,"SOFTWARE\Classes\CLSID\{Твой контлол}\Implemented Categories\{7DD95802-9882-11CF-9FA9-00AA006C42C4}" Что касается правильного создания с реализацией интерфейса, то я реализовывал его для С-шных контролов, а вот для VB не пробовал Такие ключи в реесте имеются... А вот для контрола созданного на осное MS примера их нет, но зато контрол нормально на странице размещается. к проекту каким-то образом прикреплен IObjSafe.tlb - это может быть интерфейс написанный на СИ? Реализация интерфейса на С тебе нужна? давай. MFC. CXPhone2Ctrl - это класс моего контрола. добавить в объявление класса: enum SafetyOptions { SupportedScriptingOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER, SupportedInitOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA }; // Interface map for IObjectSafety 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() В файле .сpp: //Interface map BEGIN_INTERFACE_MAP(CXPhone2Ctrl, COleControl) INTERFACE_PART(CXPhone2Ctrl, IID_IObjectSafety, MySafetyObj) END_INTERFACE_MAP() В конструкторе: CXPhone2Ctrl::CXPhone2Ctrl() { m_supportedScriptingOptions=SupportedScriptingOptions; m_supportedInitOptions=SupportedInitOptions; m_enabledScriptingOptions=0; m_enabledInitOptions=0; } Функции: //Safety STDMETHODIMP_(ULONG) CXPhone2Ctrl::XMySafetyObj::AddRef( ) { METHOD_MANAGE_STATE(CXPhone2Ctrl, MySafetyObj) ASSERT_VALID(pThis); return pThis->ExternalAddRef(); } STDMETHODIMP_(ULONG) CXPhone2Ctrl::XMySafetyObj::Release( ) { METHOD_MANAGE_STATE(CXPhone2Ctrl, MySafetyObj) ASSERT_VALID(pThis); return pThis->ExternalRelease(); } STDMETHODIMP CXPhone2Ctrl::XMySafetyObj::QueryInterface(REFIID iid, LPVOID FAR* ppvObj) { METHOD_MANAGE_STATE(CXPhone2Ctrl, MySafetyObj) ASSERT_VALID(pThis); return pThis->ExternalQueryInterface((void *)&iid, ppvObj); } STDMETHODIMP CXPhone2Ctrl::XMySafetyObj::GetInterfaceSafetyOptions( REFIID riid, DWORD __RPC_FAR *pdwSupportedOptions, DWORD __RPC_FAR *pdwEnabledOptions) { METHOD_PROLOGUE(CXPhone2Ctrl, 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 CXPhone2Ctrl::XMySafetyObj::SetInterfaceSafetyOptions( REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions) { METHOD_MANAGE_STATE(CXPhone2Ctrl, 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; } я же говорил, что это C++ и MFC Страница: 1 |
Вопрос: ActiveX в IE
Добавлено: 06.10.03 10:46
Автор вопроса: keg
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
Swift
Вопросов: 5
Ответов: 43
Профиль | | #1
Добавлено: 07.10.03 13:02
Номер ответа: 2
Автор ответа:
keg
Вопросов: 1
Ответов: 5
Профиль | | #2
Добавлено: 07.10.03 14:57
Номер ответа: 3
Автор ответа:
Swift
Вопросов: 5
Ответов: 43
Профиль | | #3
Добавлено: 07.10.03 16:03
Номер ответа: 4
Автор ответа:
keg
Вопросов: 1
Ответов: 5
Профиль | | #4
Добавлено: 07.10.03 17:08
Номер ответа: 5
Автор ответа:
Swift
Вопросов: 5
Ответов: 43
Профиль | | #5
Добавлено: 07.10.03 19:16
Номер ответа: 6
Автор ответа:
Swift
Вопросов: 5
Ответов: 43
Профиль | | #6
Добавлено: 08.10.03 10:37