Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用IProtectFocus使CDHtmlDialog从editBox的图形焦点导航?_C++_Com_Focus_Activex - Fatal编程技术网

C++ 如何使用IProtectFocus使CDHtmlDialog从editBox的图形焦点导航?

C++ 如何使用IProtectFocus使CDHtmlDialog从editBox的图形焦点导航?,c++,com,focus,activex,C++,Com,Focus,Activex,我知道IProtectFocus接口AllowFocusChange函数可以解决CDHtmlDialog执行navigate()函数时的“焦点窃取问题”,但我不太清楚如何在代码中实现IProtectFocus函数。谁能帮我一下吗?任何代码示例都非常感谢 更详细地说,我可以实现IInternetSecurityManager接口来修复javascript ActiveX权限问题。但我尝试了同样的方法来实现IProtectFocus,但不起作用。 我只需要C++代码,谢谢!p> 我的代码示例:(CC

我知道IProtectFocus接口AllowFocusChange函数可以解决CDHtmlDialog执行navigate()函数时的“焦点窃取问题”,但我不太清楚如何在代码中实现IProtectFocus函数。谁能帮我一下吗?任何代码示例都非常感谢

更详细地说,我可以实现IInternetSecurityManager接口来修复javascript ActiveX权限问题。但我尝试了同样的方法来实现IProtectFocus,但不起作用。 我只需要C++代码,谢谢!p> 我的代码示例:(CCustomControlSite是定制的IWebBrowser控件,CInstantAnswerDlg是CDHtmlDialog。)

MFC接口部分:

class CCustomControlSite: public COleControlSite    
{

public:
CCustomControlSite(COleControlContainer *pCnt):COleControlSite(pCnt){}

protected:
DECLARE_INTERFACE_MAP();
    // Implement IServiceProvider
    BEGIN_INTERFACE_PART(ServiceProvider, IServiceProvider)
        STDMETHOD(QueryService)(REFGUID,REFIID,void**);
    END_INTERFACE_PART(ServiceProvider)

    // Implement IServiceProvider
    BEGIN_INTERFACE_PART(ProtectFocus, IProtectFocus)
        STDMETHOD(AllowFocusChange)(BOOL *);
    END_INTERFACE_PART(ProtectFocus)
};
实施部分:

ULONG FAR EXPORT CCustomControlSite::XServiceProvider::AddRef()
{
    METHOD_PROLOGUE(CCustomControlSite, ServiceProvider)
        return pThis->ExternalAddRef();
}

 ULONG FAR EXPORT CCustomControlSite::XServiceProvider::Release()
 {                            
    METHOD_PROLOGUE(CCustomControlSite, ServiceProvider)
    return pThis->ExternalRelease();
 }

HRESULT FAR EXPORT CCustomControlSite::XServiceProvider::QueryInterface(REFIID riid,void** ppvObj)
 {
    METHOD_PROLOGUE(CCustomControlSite, ServiceProvider)
    HRESULT hr = (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj);
    return hr;
 }

STDMETHODIMP CCustomControlSite::XServiceProvider::QueryService(REFGUID guidService,REFIID riid,void** ppvObject)
{
    if (guidService == SID_SInternetSecurityManager && 
    riid == IID_IInternetSecurityManager)
    {
        METHOD_PROLOGUE(CCustomControlSite, ServiceProvider)
        HRESULT hr = (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObject);
    return hr;
} 
else 
{
    *ppvObject = NULL;
}
return E_NOINTERFACE;
}

// ProtectFocus Methods
ULONG FAR EXPORT CCustomControlSite::XProtectFocus::AddRef()
{
    METHOD_PROLOGUE(CCustomControlSite, ProtectFocus)
        return pThis->ExternalAddRef();
 }

ULONG FAR EXPORT CCustomControlSite::XProtectFocus::Release()
{                            
    METHOD_PROLOGUE(CCustomControlSite, ProtectFocus)
        return pThis->ExternalRelease();
}

 HRESULT FAR EXPORT CCustomControlSite::XProtectFocus::QueryInterface(REFIID riid,void** ppvObj)
{
    METHOD_PROLOGUE(CCustomControlSite, ProtectFocus)
        HRESULT hr = (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj);
     return hr;
}

 STDMETHODIMP CCustomControlSite::XProtectFocus::AllowFocusChange(BOOL *pfAllow)
 {
     *pfAllow = FALSE;
      return S_OK;
 }
将控件添加到CDHtmlDialog:

BOOL CInstantAnswerDlg::CreateControlSite(COleControlContainer* pContainer,COleControlSite** ppSite,UINT /* nID */,REFCLSID /* clsid */ )
{
    if(ppSite == NULL)
    {
        ASSERT(FALSE);
        return FALSE;
    }
    m_pCustSite = m_insAnswerManager->CreateSite(pContainer);
    if (!m_pCustSite)
        return FALSE;
    *ppSite = m_pCustSite;
    return TRUE;    
}

问题是XProtectFocus::QueryInterface和XProtectFocus::AllowFocusChange函数都没有被调用,而XServiceProvider::QueryInterface可以被调用。我错在哪里了???

您将IProtectFocus和IInternetSecurityManager的实现放在哪里取决于您对QueryService的实现。由于您在实现中调用的是CCustomControlSite::ExternalQueryInterface,因此需要添加CCustomControlSite类。

请添加语言标记谢谢,我已经阅读了MSDN文档,并将ProtectFocus接口添加到我的CCustomControlSite类中,但当代码执行时,它不会调用我的函数。我已经编辑了我的问题,请帮我检查这个问题,非常感谢。