如何实现在IE浏览器即网页和一个C++的软件进行信息交互,主要是:点击网页按钮后发送消息给程序,程序收到消息后返回一个应答消息! 如果有这方面的代码就更好了,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有没有在C++环境就能用的方法,我不想用MFC的控件,因为这样要嵌入好多MFC的类库! 这个可以实现,不过我只有BCB6的例子,不会VC . 能Send给我一份吗?[email protected] ,3X! This sample demostrates how to create an Internet Explorer window and control it.class CAutomationDlg : public CDialog{..... CComQIPtr<IWebBrowser2> m_pWebBrowser2; DWORD m_dwCookie; BOOL m_bOwnIE; afx_msg void DocumentComplete(IDispatch *pDisp,VARIANT *URL); afx_msg void OnQuit(); void AdviseSinkIE(); void UnadvisesinkIE(); void NavigateToSamplePage(BOOL bIE); CString m_strFileToFind; DECLARE_DISPATCH_MAP();.....}BEGIN_DISPATCH_MAP(CAutomationDlg, CDialog) DISP_FUNCTION_ID(CAutomationDlg, "OnQuit",DISPID_ONQUIT,OnQuit,VT_EMPTY, VTS_NONE) DISP_FUNCTION_ID(CAutomationDlg, "DocumentComplete",DISPID_DOCUMENTCOMPLETE,DocumentComplete, VT_EMPTY, VTS_DISPATCH VTS_PVARIANT).....END_DISPATCH_MAP()void CAutomationDlg::OnQuit(){ //detach to avoid AV caused by invalid reference. if(m_pWebBrowser2) { UnadvisesinkIE(); m_pWebBrowser2=(LPUNKNOWN)NULL; }}void CAutomationDlg::AdviseSinkIE(){ if(m_pWebBrowser2) { LPUNKNOWN pUnkSink = GetIDispatch(FALSE); AfxConnectionAdvise((LPUNKNOWN)m_pWebBrowser2, DIID_DWebBrowserEvents2,pUnkSink,FALSE,&m_dwCookie); }}void CAutomationDlg::UnadvisesinkIE(){ if(m_dwCookie != 0&&m_pWebBrowser2!=NULL) { LPUNKNOWN pUnkSink = GetIDispatch(FALSE); AfxConnectionUnadvise((LPUNKNOWN)m_pWebBrowser2, DIID_DWebBrowserEvents2, pUnkSink, FALSE, m_dwCookie); m_dwCookie = 0; }}void CAutomationDlg::CreateNewShellWindow(BOOL bIE){ if(!UpdateData())return; //Detach the previous instance if(m_pWebBrowser2) { if(m_bOwnIE) { m_pWebBrowser2->Quit(); m_bOwnIE=FALSE; } UnadvisesinkIE(); m_pWebBrowser2=(LPUNKNOWN)NULL; } if(bIE) { // create a new IE instance and show it m_pWebBrowser2.CoCreateInstance(CLSID_InternetExplorer); m_bOwnIE=TRUE; HRESULT hr; hr = m_pWebBrowser2->put_StatusBar(VARIANT_TRUE); hr = m_pWebBrowser2->put_ToolBar(VARIANT_TRUE); hr = m_pWebBrowser2->put_MenuBar(VARIANT_TRUE); hr = m_pWebBrowser2->put_Visible(VARIANT_TRUE); //sink for the Quit and DocumentComplete events AdviseSinkIE(); NavigateToSamplePage(bIE); }......void CAutomationDlg::NavigateToSamplePage(BOOL bIE){ if(bIE) { if(!::PathIsURL(m_strFileToFind)) m_strFileToFind=_T("http://blog.joycode.com/jiangsheng"); COleVariant vaURL((LPCTSTR)m_strFileToFind); m_pWebBrowser2->Navigate2( &vaURL,COleVariant((long) 0, VT_I4), COleVariant((LPCTSTR)NULL, VT_BSTR), COleSafeArray(), COleVariant((LPCTSTR)NULL, VT_BSTR) ); }.....void CAutomationDlg::DocumentComplete(IDispatch *pDisp,VARIANT *URL){ //HTML DOM is available AFTER DocumentComplete is fired. //For more information, please visit KB article //"How To Determine When a Page Is Done Loading in WebBrowser Control" //http://support.microsoft.com/kb/q180366/ CComQIPtr<IUnknown,&IID_IUnknown> pWBUK(m_pWebBrowser2); CComQIPtr<IUnknown,&IID_IUnknown> pSenderUK(pDisp); USES_CONVERSION; TRACE(_T("Page downloading complete:\r\n")); CComBSTR bstrName; m_pWebBrowser2->get_LocationName(&bstrName); CComBSTR bstrURL; m_pWebBrowser2->get_LocationURL(&bstrURL); TRACE(_T("Name:[ %s ]\r\nURL: [ %s ]\r\n"), OLE2T(bstrName), OLE2T(bstrURL)); if (pWBUK== pSenderUK) { CComQIPtr<IDispatch> pHTMLDocDisp; m_pWebBrowser2->get_Document(&pHTMLDocDisp); CComQIPtr<IHTMLDocument2> pHTMLDoc(pHTMLDocDisp); if(pHTMLDoc) { CComBSTR bstrNewTitle(_T("Sheng Jiang's Automation Test")); pHTMLDoc->put_title(bstrNewTitle); CComQIPtr<IHTMLElementCollection> ecAll; pHTMLDoc->get_all(&ecAll); if(ecAll) { CComPtr<IDispatch> pTagLineDisp; ecAll->item(COleVariant(_T("tagline")),COleVariant((long)0),&pTagLineDisp); CComQIPtr<IHTMLElement> eTagLine(pTagLineDisp); if(eTagLine) { eTagLine->put_innerText(CComBSTR(_T("Command what is yours, conquer what is not. --Kane"))); } } } }To handle button click in your application, check the MSDN article "Handling HTML Element Events (Internet Explorer - Hosting MSHTML"(http://msdn.microsoft.com/workshop/browser/mshtml/tutorials/sink.asp) 做成ActiveX控件,实现IDispatch,然后在网页脚本里面创建,js是用类似这样的语法:oCtrl = new ActiveXObject("CppLib.IeCtrl");然后oCtrl.XXX这样来使用 VC操作office文档::能不能在服务(会话0下面)里面读取office文档? 请问error LNK2005的错误是怎么产生的 获取光标位置、文本输出问题|在线等! ping程序中的超时问题 WM_NOTIFY消息的参数看不明白 一个关于对话框的问题,急!! makefile文件如何转化在vc编译 在vc中,怎样编程实现将已有的数据库备份文件还原成数据库文件,代码应该怎么写??? win2k下如何隐藏过程(用户在按CTRL+ALT+DEL时不显示该程序) 用MFC的单文档写视频播放器 招VC高手 一个简单的OpenGL问题,请高手指点。
{
.....
CComQIPtr<IWebBrowser2> m_pWebBrowser2;
DWORD m_dwCookie;
BOOL m_bOwnIE;
afx_msg void DocumentComplete(IDispatch *pDisp,VARIANT *URL);
afx_msg void OnQuit();
void AdviseSinkIE();
void UnadvisesinkIE();
void NavigateToSamplePage(BOOL bIE);
CString m_strFileToFind;
DECLARE_DISPATCH_MAP();
.....
}
BEGIN_DISPATCH_MAP(CAutomationDlg, CDialog)
DISP_FUNCTION_ID(CAutomationDlg, "OnQuit",DISPID_ONQUIT,OnQuit,VT_EMPTY, VTS_NONE)
DISP_FUNCTION_ID(CAutomationDlg, "DocumentComplete",DISPID_DOCUMENTCOMPLETE,DocumentComplete,
VT_EMPTY, VTS_DISPATCH VTS_PVARIANT)
.....
END_DISPATCH_MAP()
void CAutomationDlg::OnQuit()
{
//detach to avoid AV caused by invalid reference.
if(m_pWebBrowser2)
{
UnadvisesinkIE();
m_pWebBrowser2=(LPUNKNOWN)NULL;
}
}
void CAutomationDlg::AdviseSinkIE()
{
if(m_pWebBrowser2)
{
LPUNKNOWN pUnkSink = GetIDispatch(FALSE);
AfxConnectionAdvise((LPUNKNOWN)m_pWebBrowser2,
DIID_DWebBrowserEvents2,pUnkSink,FALSE,&m_dwCookie);
}
}
void CAutomationDlg::UnadvisesinkIE()
{
if(m_dwCookie != 0&&m_pWebBrowser2!=NULL)
{
LPUNKNOWN pUnkSink = GetIDispatch(FALSE);
AfxConnectionUnadvise((LPUNKNOWN)m_pWebBrowser2, DIID_DWebBrowserEvents2, pUnkSink, FALSE, m_dwCookie);
m_dwCookie = 0;
}
}
void CAutomationDlg::CreateNewShellWindow(BOOL bIE)
{
if(!UpdateData())return;
//Detach the previous instance
if(m_pWebBrowser2)
{
if(m_bOwnIE)
{
m_pWebBrowser2->Quit();
m_bOwnIE=FALSE;
}
UnadvisesinkIE();
m_pWebBrowser2=(LPUNKNOWN)NULL;
}
if(bIE)
{
// create a new IE instance and show it
m_pWebBrowser2.CoCreateInstance(CLSID_InternetExplorer);
m_bOwnIE=TRUE;
HRESULT hr;
hr = m_pWebBrowser2->put_StatusBar(VARIANT_TRUE);
hr = m_pWebBrowser2->put_ToolBar(VARIANT_TRUE);
hr = m_pWebBrowser2->put_MenuBar(VARIANT_TRUE);
hr = m_pWebBrowser2->put_Visible(VARIANT_TRUE);
//sink for the Quit and DocumentComplete events
AdviseSinkIE();
NavigateToSamplePage(bIE);
}
......
void CAutomationDlg::NavigateToSamplePage(BOOL bIE)
{
if(bIE)
{
if(!::PathIsURL(m_strFileToFind))
m_strFileToFind=_T("http://blog.joycode.com/jiangsheng");
COleVariant vaURL((LPCTSTR)m_strFileToFind);
m_pWebBrowser2->Navigate2(
&vaURL,COleVariant((long) 0, VT_I4),
COleVariant((LPCTSTR)NULL, VT_BSTR),
COleSafeArray(),
COleVariant((LPCTSTR)NULL, VT_BSTR)
);
}
.....
void CAutomationDlg::DocumentComplete(IDispatch *pDisp,VARIANT *URL)
{
//HTML DOM is available AFTER DocumentComplete is fired.
//For more information, please visit KB article
//"How To Determine When a Page Is Done Loading in WebBrowser Control"
//http://support.microsoft.com/kb/q180366/
CComQIPtr<IUnknown,&IID_IUnknown> pWBUK(m_pWebBrowser2);
CComQIPtr<IUnknown,&IID_IUnknown> pSenderUK(pDisp);
USES_CONVERSION;
TRACE(_T("Page downloading complete:\r\n"));
CComBSTR bstrName;
m_pWebBrowser2->get_LocationName(&bstrName);
CComBSTR bstrURL;
m_pWebBrowser2->get_LocationURL(&bstrURL);
TRACE(_T("Name:[ %s ]\r\nURL: [ %s ]\r\n"),
OLE2T(bstrName),
OLE2T(bstrURL));
if (pWBUK== pSenderUK)
{
CComQIPtr<IDispatch> pHTMLDocDisp;
m_pWebBrowser2->get_Document(&pHTMLDocDisp);
CComQIPtr<IHTMLDocument2> pHTMLDoc(pHTMLDocDisp);
if(pHTMLDoc)
{
CComBSTR bstrNewTitle(_T("Sheng Jiang's Automation Test"));
pHTMLDoc->put_title(bstrNewTitle);
CComQIPtr<IHTMLElementCollection> ecAll;
pHTMLDoc->get_all(&ecAll);
if(ecAll)
{
CComPtr<IDispatch> pTagLineDisp;
ecAll->item(COleVariant(_T("tagline")),COleVariant((long)0),&pTagLineDisp);
CComQIPtr<IHTMLElement> eTagLine(pTagLineDisp);
if(eTagLine)
{
eTagLine->put_innerText(CComBSTR(_T("Command what is yours, conquer what is not. --Kane")));
}
}
}
}
To handle button click in your application, check the MSDN article
"Handling HTML Element Events (Internet Explorer - Hosting MSHTML"
(http://msdn.microsoft.com/workshop/browser/mshtml/tutorials/sink.asp)
oCtrl = new ActiveXObject("CppLib.IeCtrl");然后oCtrl.XXX这样来使用