精通VC/Delphi的大虾100分相送,只要你能够从VC翻译DELPHI

zhuojohn 2003-03-31 09:55:23
//通过名字访问元素接口

HRESULT CDHtmlDialog::GetElement(LPCTSTR szElementId, IHTMLElement **pphtmlElement)
{
return GetElementInterface(szElementId, __uuidof(IHTMLElement), (void **)
pphtmlElement);
}

//通过名字访问元素接口的辅助函数,用于返回指定类型的接口
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;
}

//通过名字访问元素接口的辅助函数,用于访问指定ID的元素接口。如果pBCollection返回TRUE,则返
回的是一个IHtmlElementCollection集合,表示指定ID/名称的网页元素不止一个。
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;
}

//获得ActiveX控件接口,注意ActiveX控件接口和HTML对象元素接口不是同一个接口,你不能直接使用IHtmlObjectElement接口来访问控件
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(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(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);
}

//获得控件属性的辅助函数,通过DispID访问
VARIANT CDHtmlDialog::GetControlProperty(LPCTSTR szId, DISPID dispid)
{
CComPtr<IDispatch> spdispElem;

GetControlDispatch(szId, &spdispElem);
return GetControlProperty(spdispElem, dispid);
}

//设置控件属性的辅助函数,通过DispID访问
void CDHtmlDialog::SetControlProperty(LPCTSTR szElementId, DISPID dispid, VARIANT *pVar)
{
CComPtr<IDispatch> spdispElem;
GetControlDispatch(szElementId, &spdispElem);

SetControlProperty(spdispElem, dispid, pVar);
}

//获得控件属性的实现函数
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;
}

//设置控件属性的实现函数
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);
}
}
...全文
39 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
myling 2003-03-31
  • 打赏
  • 举报
回复
为什么要翻译呢?

直接做成dll调用不行吗?

westfly 2003-03-31
  • 打赏
  • 举报
回复
这个翻一遍也太累了吧?
halfdream 2003-03-31
  • 打赏
  • 举报
回复
只作旁观。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧