не приходит DISPID_AMBIENT_DLCONTROL при Static Link to ATL
От: umax  
Дата: 24.03.10 08:51
Оценка:
создаю в VS 2008 проект atl/wtl mdi, чилды HTMLPage
в методе
LRESULT CWebView::OnCreate(UINT _uMsg, WPARAM _wParam, LPARAM _lParam, BOOL& _bHandled)
{
...
тут делаю
CComPtr<IAxWinAmbientDispatchEx> spWinHost;
CComPtr<IOleControl> pOleControl;

m_ambientDispatch.AddPropertyForDownolad(m_dwLevel > 0 ? DLCTL_DLIMAGES : 0);
this->QueryHost(&spWinHost);
spWinHost->SetAmbientDispatch(&m_ambientDispatch);

if ((*this)->QueryInterface(IID_IOleControl, (LPVOID*)&pOleControl) == S_OK)
{
pOleControl->OnAmbientPropertyChange(DISPID_AMBIENT_DLCONTROL);
}

так вот тут при "Static Link to ATL" даже в Invoke не приходит

STDMETHODIMP CWebView::CAmbientDispatch::Invoke(DISPID _dispidMember, REFIID _riid, LCID _lcid, WORD _wFlags, DISPPARAMS* _pDispParams, VARIANT* _pVarResult, EXCEPINFO* _pexcepinfo, UINT* _puArgErr)
{
if(_dispidMember == DISPID_AMBIENT_DLCONTROL)
{
::VariantInit(_pVarResult) ;
CComVariant var((INT)m_dwControlFlags, VT_I4 ) ;

return var.Detach(_pVarResult);
}

return DISP_E_MEMBERNOTFOUND ;
}

если ставить "Dynamic Link to ATL" все ок!

Кто может подсказать в чем проблема?
Re: не приходит DISPID_AMBIENT_DLCONTROL при Static Link to
От: umax  
Дата: 19.04.10 06:25
Оценка:
Решил проблему сам, следующим способом:
1) При создании проекта MDI в визарде WTL/ATL указал Enable ActiveX Control Hosting и Create as COM Server
2) Пришлось самому создать control следующим способом
LRESULT CWebView::OnCreate(UINT _uMsg, WPARAM _wParam, LPARAM _lParam, BOOL& _bHandled)
{
LRESULT lResult = this->DefWindowProc(_uMsg, _wParam, _lParam);
CComPtr<IAxWinHostWindow> spAxWindow;
CComPtr<IAxWinAmbientDispatchEx> spAxWinAmbient;
CComQIPtr<IDispatch> spDispatch;
HRESULT hResult = this->QueryHost(&spAxWinAmbient);

// Create the custom IDispatch object
m_spAmbientDispatch = NULL;
hResult = CComObject<CAmbientDispatch>::CreateInstance(&m_spAmbientDispatch);
m_spAmbientDispatch->PropertyForDownolad(m_fDownloadImages ? DLCTL_DLIMAGES : 0);
spDispatch = m_spAmbientDispatch;

// Set the custom IDispatch object
hResult = spAxWinAmbient->SetAmbientDispatch(spDispatch);

// Get the IAxWinHostWindow interface to create the WebBrowser Control
hResult = this->QueryHost(&spAxWindow);
// Create the control in the Host window
LPOLESTR pszName = OLESTR("Shell.Explorer");
hResult = spAxWindow->CreateControl(pszName, m_hWnd, NULL);
hResult = AtlAxGetControl(m_hWnd, &m_pUnk);

if (SUCCEEDED(hResult))
{
hResult = m_pUnk->QueryInterface(IID_IWebBrowser2, (LPVOID*) (CComPtr<IWebBrowser2>*)this);

if (SUCCEEDED(hResult))
{
AtlGetObjectSourceInterface(m_pUnk, &m_libid, &m_iid, &m_wMajorVerNum, &m_wMinorVerNum);
this->DispEventAdvise(m_pUnk, &m_iid);
}

(*this)->put_Silent(VARIANT_TRUE);
}

return lResult;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.