5-8万年薪顶级嵌入式,京沪深就业地 浅谈并行编程中的任务分解模式
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  HTML/XML

怎样从获得的IHtmlDocument2的接口中进一步获得flash的地址...(jiangsheng能帮忙吗)

楼主zmxjh(zmx)2002-08-12 17:39:57 在 VC/MFC / HTML/XML 提问

我用elementFromPoint方法获得了flash对像的接口,再怎么进一步获得这个flash对像的地址呢?如  
  <PARAM   NAME=movie   VALUE="/images/ad/winsunlight_banner.swf">  
  中   VALUE   的值? 问题点数:100、回复次数:7Top

1 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-08-13 13:57:28 得分 0

方法1:使用IHTMLDOMNode及相关接口访问HTML文档节点模型  
  方法2:(你需要知道控件属性的DispID)手动调用IDispatch::Invoke方法Top

2 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-08-13 21:23:19 得分 100

From   MFC   source:  
  HRESULT   CDHtmlDialog::GetElement(LPCTSTR   szElementId,   IDispatch   **ppdisp,    
    BOOL   *pbCollection   /*=   NULL*/)  
  {  
  CComPtr<IHTMLElementCollection>   sphtmlAll;  
  CComPtr<IHTMLElementCollection>   sphtmlColl;  
  CComPtr<IDispatch>   spdispElem;  
  CComVariant   varName;  
  CComVariant   varIndex;  
  HRESULT   hr   =   S_OK;  
  CComPtr<IHTMLDocument2>   sphtmlDoc;  
  USES_CONVERSION;  
   
  *ppdisp   =   NULL;  
   
  if   (pbCollection)  
  *pbCollection   =   FALSE;  
   
  hr   =   GetDHtmlDocument(&sphtmlDoc);  
  if   (sphtmlDoc   ==   NULL)  
  return   hr;  
   
  varName.vt   =   VT_BSTR;  
  varName.bstrVal   =   T2BSTR(szElementId);  
  if   (!varName.bstrVal)  
  {  
  hr   =   E_OUTOFMEMORY;  
  goto   Error;  
  }  
   
  hr   =   sphtmlDoc->get_all(&sphtmlAll);  
  if   (sphtmlAll   ==   NULL)  
  goto   Error;  
  hr   =   sphtmlAll->item(varName,   varIndex,   &spdispElem);  
  if   (spdispElem   ==   NULL)  
  {  
  hr   =   E_NOINTERFACE;  
  goto   Error;  
  }  
   
  spdispElem->QueryInterface(__uuidof(IHTMLElementCollection),   (void   **)   &sphtmlColl);  
  if   (sphtmlColl)  
  {  
  if   (pbCollection)  
  *pbCollection   =   TRUE;  
  #ifdef   _DEBUG  
  else  
  {  
  TRACE(traceHtml,   0,   "Warning:   duplicate   IDs   or   NAMEs.\n");  
  ATLASSERT(FALSE);  
  }  
  #endif  
   
  }  
  Error:  
  if   (SUCCEEDED(hr))  
  {  
  *ppdisp   =   spdispElem;  
  if   (spdispElem)  
  (*ppdisp)->AddRef();  
  }  
  return   hr;  
  }  
   
  HRESULT   CDHtmlDialog::GetElement(LPCTSTR   szElementId,   IHTMLElement   **pphtmlElement)  
  {  
  return   GetElementInterface(szElementId,   __uuidof(IHTMLElement),   (void   **)   pphtmlElement);  
  }  
  HRESULT   CDHtmlDialog::GetControlDispatch(LPCTSTR   szId,   IDispatch   **ppdisp)  
  {  
  HRESULT   hr   =   S_OK;  
  CComPtr<IDispatch>   spdispElem;  
   
  hr   =   GetElement(szId,   &spdispElem);  
   
  if   (spdispElem)  
  {  
  CComPtr<IHTMLObjectElement>   sphtmlObj;  
   
  hr   =   spdispElem.QueryInterface(&sphtmlObj);  
  if   (sphtmlObj)  
  {  
  spdispElem.Release();  
  hr   =   sphtmlObj->get_object(ppdisp);  
  }  
  }  
  return   hr;  
  }  
   
  VARIANT   CDHtmlDialog::GetControlProperty(IDispatch   *pdispControl,   DISPID   dispid)  
  {  
  VARIANT   varRet;  
  varRet.vt   =   VT_EMPTY;  
  if   (pdispControl)  
  {  
  DISPPARAMS   dispparamsNoArgs   =   {   NULL,   NULL,   0,   0   };  
  pdispControl->Invoke(dispid,   IID_NULL,   LOCALE_USER_DEFAULT,    
  DISPATCH_PROPERTYGET,   &dispparamsNoArgs,   &varRet,   NULL,   NULL);  
  }  
  return   varRet;  
  }  
   
  VARIANT   CDHtmlDialog::GetControlProperty(LPCTSTR   szId,   DISPID   dispid)  
  {  
  CComPtr<IDispatch>   spdispElem;  
   
  GetControlDispatch(szId,   &spdispElem);  
  return   GetControlProperty(spdispElem,   dispid);  
  }  
   
  VARIANT   CDHtmlDialog::GetControlProperty(LPCTSTR   szId,   LPCTSTR   szPropName)  
  {  
  CComVariant   varEmpty;  
  CComPtr<IDispatch>   spdispElem;  
   
  GetControlDispatch(szId,   &spdispElem);  
  if   (!spdispElem)  
  return   varEmpty;  
   
  DISPID   dispid;  
  USES_CONVERSION;  
  LPOLESTR   pPropName   =   (LPOLESTR)T2COLE(szPropName);  
  HRESULT   hr   =   spdispElem->GetIDsOfNames(IID_NULL,   &pPropName,   1,   LOCALE_USER_DEFAULT,   &dispid);  
  if   (SUCCEEDED(hr))  
  return   GetControlProperty(spdispElem,   dispid);  
  return   varEmpty;  
  }  
   
  void   CDHtmlDialog::SetControlProperty(IDispatch   *pdispControl,   DISPID   dispid,   VARIANT   *pVar)  
  {  
  if   (pdispControl   !=   NULL)  
  {  
  DISPPARAMS   dispparams   =   {NULL,   NULL,   1,   1};  
  dispparams.rgvarg   =   pVar;  
  DISPID   dispidPut   =   DISPID_PROPERTYPUT;  
  dispparams.rgdispidNamedArgs   =   &dispidPut;  
   
  pdispControl->Invoke(dispid,   IID_NULL,  
  LOCALE_USER_DEFAULT,   DISPATCH_PROPERTYPUT,  
  &dispparams,   NULL,   NULL,   NULL);  
  }  
  }  
   
  void   CDHtmlDialog::SetControlProperty(LPCTSTR   szElementId,   DISPID   dispid,   VARIANT   *pVar)  
  {  
  CComPtr<IDispatch>   spdispElem;  
  GetControlDispatch(szElementId,   &spdispElem);  
   
  SetControlProperty(spdispElem,   dispid,   pVar);  
  }  
   
  void   CDHtmlDialog::SetControlProperty(LPCTSTR   szElementId,   LPCTSTR   szPropName,   VARIANT   *pVar)  
  {  
  CComPtr<IDispatch>   spdispElem;  
  GetControlDispatch(szElementId,   &spdispElem);  
  if   (!spdispElem)  
  return;  
  DISPID   dispid;  
  USES_CONVERSION;  
  LPOLESTR   pPropName   =   (LPOLESTR)T2COLE(szPropName);  
  HRESULT   hr   =   spdispElem->GetIDsOfNames(IID_NULL,   &pPropName,   1,   LOCALE_USER_DEFAULT,   &dispid);  
  if   (SUCCEEDED(hr))  
  SetControlProperty(spdispElem,   dispid,   pVar);  
  }Top

3 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-08-13 21:23:41 得分 0

HRESULT   CDHtmlDialog::GetElementInterface(LPCTSTR   szElementId,   REFIID   riid,   void   **ppvObj)  
  {  
  HRESULT   hr   =   E_NOINTERFACE;  
  *ppvObj   =   NULL;  
  CComPtr<IDispatch>   spdispElem;  
   
  hr   =   GetElement(szElementId,   &spdispElem);  
   
  if   (spdispElem)  
  hr   =   spdispElem->QueryInterface(riid,   ppvObj);  
  return   hr;  
  }Top

4 楼Viper()回复于 2002-08-13 21:31:42 得分 0

gzerTop

5 楼zmxjh(zmx)回复于 2002-08-15 15:05:47 得分 0

我想jiangsheng给了我想要的。Top

6 楼rocshaw(太阳鸟(抵制日货))回复于 2002-08-15 15:14:39 得分 0

geifengTop

7 楼jiangsheng(蒋晟.Net[MVP])回复于 2002-08-16 14:10:39 得分 0

由于GetIDsOfNames这个操作很慢,推荐缓存得到的DispID。Top

相关问题

  • 请教iwebbrowser和ihtmldocument接口
  • 100分求如何從DHtmlEdit For IE5的控件中得到IHtmlDocument/IHtmlDocument,IHTMLBodyElement接口
  • 如何在DCOM的接口中传递IHTMLDocument 型指针?
  • 最后20分! 可否通过URL获得html文档的Ihtmldocument接口??
  • 接口
  • 接口
  • 有关IHTMLDocument2接口一系列问题,300分大赠送,masterz(),jiangsheng(蒋晟)请进~~~~~
  • 得到IHTMLDocument接口之后怎么样高亮显示网页上的部分文字?
  • DirectDraw的接口
  • 关于接口...

关键词

  • hr
  • 接口
  • spdispelem
  • dispid
  • szelementid
  • cdhtmldialog
  • pdispcontrol
  • getcontrolproperty
  • pbcollection
  • setcontrolproperty

得分解答快速导航

  • 帖主:zmxjh
  • jiangsheng

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
x 提问