【发布时间】:2011-07-27 15:03:28
【问题描述】:
【问题讨论】:
-
你需要真的澄清你的问题。根据"How to Ask" guide,您需要比这更具体。
标签: visual-c++ c++-cli
【问题讨论】:
标签: visual-c++ c++-cli
很久以前,我已经找到了解决同样问题的方法,但这只是 BHO 的一次实验,所以今天几乎不记得要做什么了。但是我可以给你这段代码作为进一步搜索的起点。
void CEventSink::Event_NavigateComplete(IDispatch *pDisp, LPOLESTR url)
{
HRESULT hr;
IDispatch *pTmpDisp;
IWebBrowser2 *pFrame;
hr = pDisp->QueryInterface(IID_IWebBrowser2, (void **)&pFrame);
if (FAILED(hr) || !pFrame)
return;
hr = pFrame->get_Document(&pTmpDisp);
if (FAILED(hr) || !pTmpDisp)
return;
IHTMLDocument2 *pDocument;
hr = pTmpDisp->QueryInterface(IID_IHTMLDocument2, (void **)&pDocument);
if (FAILED(hr) || !pDocument)
return;
IHTMLWindow2 *pWindow;
pDocument->get_parentWindow(&pWindow);
if (FAILED(hr) || !pWindow)
return;
IDispatchEx *pDispEx;
hr = pWindow->QueryInterface(IID_IDispatchEx, (void **)&pDispEx);
if (FAILED(hr) || !pDispEx)
return;
DISPID dispId;
BSTR name = SysAllocString(_T("someMethod"));
pDispEx->GetDispID(name, fdexNameEnsure, &dispId);
SysFreeString(name);
if (FAILED(hr) || dispId == DISPID_UNKNOWN)
return;
hr = this->QueryInterface(IID_IDispatch, (void **)&pTmpDisp);
if (FAILED(hr) || !pTmpDisp)
return;
VARIANT v;
VariantInit(&v);
v.vt = VT_DISPATCH;
v.pdispVal = pTmpDisp;
DISPID ppid = DISPID_PROPERTYPUT;
DISPPARAMS p;
p.rgvarg = &v;
p.cArgs = 1;
p.rgdispidNamedArgs = &ppid;
p.cNamedArgs = 1;
hr = pDispEx->InvokeEx(dispId, LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYPUT, &p, NULL, NULL, NULL);
}
【讨论】: