怎样从获得的IHtmlDocument2的接口中进一步获得flash的地址...(jiangsheng能帮忙吗)
我用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的接口
- 关于接口...



