MFC和Javascript混合编程

小小虫啊 2014-01-16 10:01:45
问题如下:

我用VC 6.0创建一个Dialog(MFC编程),然后在Dialog中添加一个WebBrowser,用于显示网页的(如蘑菇街)。我的程序中嵌入一段javascript代码,然后我加载一个登录网页,在页面里面登录成功后,我开始执行我嵌入程序里面的Javascript代码,(用msscript.ocx执行),发送信息到服务器,javascript程序执行成功,捕捉到有信息发出,但是服务器没有任何的信息返回,正确的应该是有信息返回,而且会修改服务器那边的数据的。

请大神们帮帮忙 > ...

代码如下:
这是嵌入MFC里面的代码,写在一个函数里面然后返回字符串

CString CKkDlg::OnJavascriptString()
{
CString lpszJavascript = "";

lpszJavascript = lpszJavascript + "var xmlHttp;" +
"function createXMLHttpRequest()" +
"{" +
"if(window.ActiveXObject)" +
"{" +
"xmlHttp = new ActiveXObject('Microsoft.XMLHttp');" +
"}" +
"else if(window.XMLHttpRequest)" +
"{" +
"xmlHttp = new XMLHttpRequest();" +
"if(xmlHttp.overrideMimeType)" +
"{" +
"xmlHttp.overrideMimeType('text/xml');" +
"}" +
"}" +
"else" +
"{" +
"alert('ELSE');" +
"}" +
"}" +

"function OnGetMessage()" +
"{" +
"var m_msg = 'followIds[]=" + UserID + "';" +
"return m_msg;" +
"}" +

"function StartRequest()" +
"{" +
"createXMLHttpRequest();" +
//请求的URL
"var URL = 'http://shop.mogujie.com/collect/addfollow';" +
//"var URL = 'https://www.mogujie.com/nlogin';" +
//准备发送的内容
"var m_msg = OnGetMessage();" +
//"var m_msg = '" + lpszMSG + "';" +
//打开URL
"xmlHttp.open('POST', URL, true);" +

"xmlHttp.onreadystatechange = handleStateChange;" +
//设置HTTP的头
"xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');" +
//"xmlHttp.setRequestHeader('Origin', 'http://www.mogujie.com');" +
"xmlHttp.setRequestHeader('x-requested-with', 'XMLHttpRequest');" +
"xmlHttp.setRequestHeader('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0');" +
"xmlHttp.setRequestHeader('Accept', 'application/json, text/javascript, */*; q=0.01');" +
"xmlHttp.setRequestHeader('referer', 'http://shop.mogujie.com/detail/16mdnya?traceid=book_vw8i26j3pq8');" +
"xmlHttp.setRequestHeader('Content-Length', m_msg.Length);" +
"xmlHttp.setRequestHeader('Connection', 'Keep-Alive');" +
"xmlHttp.setRequestHeader('Accept-Encoding', 'gzip, deflate');" +
"xmlHttp.setRequestHeader('Accept-Language', 'zh-CN,en,*');" +
"xmlHttp.setRequestHeader('Host', 'shop.mogujie.com');" +
//发送请求
"xmlHttp.send(m_msg);" +
"}" +

"function handleStateChange()" +
"{" +
//数据接收成功
"if (xmlHttp.readyState==4 && xmlHttp.status==200)" +
"{"
//"var responseDiv = document.getElementById('serverResponse');" +
//"responseDiv.innerHTML = '返回数据:' + xmlHttp.responseText;" +

"return xmlHttp.responseText;" +
"}" +
"}";
return lpszJavascript;
}




这个是我点击按钮要执行的代码


void CKkDlg::OnExecuteScript()
{
// CString lpszMMM = "javascript:" + OnJavascriptString();
// m_browser.Navigate(lpszMMM, NULL, NULL, NULL, NULL);
// return;

//初始化COM
CoInitialize(NULL);

//获取Javascript代码
CString strJsCode = OnJavascriptString();

IScriptControlPtr spScript(__uuidof(ScriptControl));

HRESULT hr = spScript->put_Language(_bstr_t(_T("JavaScript")));

IHTMLDocument2 *objDocument1 = NULL;
IHTMLWindow2 *pIHTMLWindow1 = NULL;

objDocument1 = (IHTMLDocument2*)m_browser.GetDocument();

if (objDocument1)
{
objDocument1->get_parentWindow(&pIHTMLWindow1);
spScript->AddObject(_bstr_t("window"), pIHTMLWindow1, VARIANT_TRUE);
}

spScript->AllowUI = TRUE;

hr = spScript->AddCode(_bstr_t(strJsCode));

//执行javascript
_variant_t vRet = spScript->Eval(_bstr_t(_T("StartRequest();")));
//_variant_t vRet;
//spScript->raw_Eval(_bstr_t(_T("StartRequest();")), &vRet);

MessageBox(_bstr_t(vRet));

CoUninitialize();
}



如果问题解决了,我会再加分,谢谢O(∩_∩)O谢谢大神们不论赐教 > ...

...全文
555 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
Adol1111 2014-01-19
  • 打赏
  • 举报
回复
说实话,你还不如自己管理这些内容。暂且不说Js,光解决跨域就不比直接用socket来的简单!!
Adol1111 2014-01-19
  • 打赏
  • 举报
回复
你可以试试看在你的程序里内嵌(隐藏)一个该网站的网页,然后当你跨域访问的时候,通过该网页进行访问,然后再想办法取出网页内的内容,这样应该就不涉及跨域了,不过这方面我也不熟。
Adol1111 2014-01-19
  • 打赏
  • 举报
回复
引用 22 楼 zhu_ing 的回复:
用js的目的就是 管理数据比较用于 像cookie那些东西,变动的比较频繁,用JS执行就 不用自己管理,用Socket的话,要管理这些东西 > ...
你说的也没错,Js的确还是蛮好用的,但一般都是用来处理页面元素什么的,即使是用AJAX之类的访问后台,一般也只做站内的,因为涉及到安全问题。如果必须使用跨域的话,最好是设置代理,但C/S架构下怎么做我不太清楚。
小小虫啊 2014-01-19
  • 打赏
  • 举报
回复
引用 21 楼 Adol1111 的回复:
[quote=引用 20 楼 zhu_ing 的回复:] [quote=引用 19 楼 Adol1111 的回复:] 单纯的执行Js一般是没什么问题的,但你这个不仅执行了Js还把数据post给后台的方法就有问题了,因为你不是在那个网站的页面执行的,涉及到跨站的安全问题。 解决方法的话其实也很简单,既然你最终都要在后台执行,那不如你直接在自己这边解决就可以了。或者还有万能的webservice,让服务器端直接提供一个接口让你调用就可以了,不需要通过Js做中间媒介。
是的,我就是要解决跨域的问题的。都搞了差不多一个月了,就是这个把我卡住了。我想用webbrowser来执行我的javascript的,这样就不用那么麻烦了,但是webbrowser就只能执行几句JS代码,一大段的执行不下去,不知道是什么问题, 呼呼 > ...[/quote] webbrowser我不太了解,但是你可以直接把数据post给web嘛,为什么一定要用js执行?[/quote] 用js的目的就是 管理数据比较用于 像cookie那些东西,变动的比较频繁,用JS执行就 不用自己管理,用Socket的话,要管理这些东西 > ...
Adol1111 2014-01-19
  • 打赏
  • 举报
回复
引用 20 楼 zhu_ing 的回复:
[quote=引用 19 楼 Adol1111 的回复:] 单纯的执行Js一般是没什么问题的,但你这个不仅执行了Js还把数据post给后台的方法就有问题了,因为你不是在那个网站的页面执行的,涉及到跨站的安全问题。 解决方法的话其实也很简单,既然你最终都要在后台执行,那不如你直接在自己这边解决就可以了。或者还有万能的webservice,让服务器端直接提供一个接口让你调用就可以了,不需要通过Js做中间媒介。
是的,我就是要解决跨域的问题的。都搞了差不多一个月了,就是这个把我卡住了。我想用webbrowser来执行我的javascript的,这样就不用那么麻烦了,但是webbrowser就只能执行几句JS代码,一大段的执行不下去,不知道是什么问题, 呼呼 > ...[/quote] webbrowser我不太了解,但是你可以直接把数据post给web嘛,为什么一定要用js执行?
小小虫啊 2014-01-19
  • 打赏
  • 举报
回复
引用 19 楼 Adol1111 的回复:
单纯的执行Js一般是没什么问题的,但你这个不仅执行了Js还把数据post给后台的方法就有问题了,因为你不是在那个网站的页面执行的,涉及到跨站的安全问题。 解决方法的话其实也很简单,既然你最终都要在后台执行,那不如你直接在自己这边解决就可以了。或者还有万能的webservice,让服务器端直接提供一个接口让你调用就可以了,不需要通过Js做中间媒介。
是的,我就是要解决跨域的问题的。都搞了差不多一个月了,就是这个把我卡住了。我想用webbrowser来执行我的javascript的,这样就不用那么麻烦了,但是webbrowser就只能执行几句JS代码,一大段的执行不下去,不知道是什么问题, 呼呼 > ...
Adol1111 2014-01-19
  • 打赏
  • 举报
回复
单纯的执行Js一般是没什么问题的,但你这个不仅执行了Js还把数据post给后台的方法就有问题了,因为你不是在那个网站的页面执行的,涉及到跨站的安全问题。 解决方法的话其实也很简单,既然你最终都要在后台执行,那不如你直接在自己这边解决就可以了。或者还有万能的webservice,让服务器端直接提供一个接口让你调用就可以了,不需要通过Js做中间媒介。
小小虫啊 2014-01-19
  • 打赏
  • 举报
回复
引用 17 楼 Adol1111 的回复:
[quote=引用 16 楼 zhu_ing 的回复:] [quote=引用 15 楼 Adol1111 的回复:] 我检查过了,能取到数据的。不过问题不在这里,而是其他方面。 1、你的js是异步的,所以在你主函数结束的时候,handleStateChange还没有开始执行 2、handleStateChange() return回来的数据不是给你StartRequest()的,所以你取回来的数据都是"",因为StartRequest本身就没有返回值。 你先执行StartRequest然后再手动调用一次handleStateChange就可以取到数据了。 不要改成这种,这样没效果的,因为还没有执行完毕,就取数据了。
_variant_t vRet = spScript->Eval(_bstr_t(_T("StartRequest();handleStateChange()")));
或者你这样改:
xmlHttp.open('POST', URL, false);//改成同步

_variant_t vRet = spScript->Eval(_bstr_t(_T("StartRequest();handleStateChange()")));
这些方法我之前都试过了, 这段返回的信息用alert输出来是这样的: 未知错误,可能原因 1.网络问题 2.服务器超时 3.其他原因 出现这个问题,很大可能就是服务器不接受我的数据,或者是Cookie的问题,但就是不知道怎样解决这个问题,因为显示网页的是用Webbrowser,而执行javascript的是msscript.ocx,所以很大的可能是Cookie不同,服务器不接受他不认同的数据的,不知道是不是这个原因,其次就是不知道怎样才能把javascript的代码注入到webbrowser中执行。谢谢 >......[/quote] 应该是被服务器给拒绝了。我之前是在自己的页面上执行这段脚本的,但是一般服务器是不允许跨站执行Js访问后台方法的,所以我后来直接到你URL里的那个页面上执行就可以了。 其他的我就不清楚了,你自己再查查看。[/quote] 那怎么办?你有木有好的办法解决这个问题?谢谢O(∩_∩)O谢谢 > ...
Adol1111 2014-01-19
  • 打赏
  • 举报
回复
引用 16 楼 zhu_ing 的回复:
[quote=引用 15 楼 Adol1111 的回复:] 我检查过了,能取到数据的。不过问题不在这里,而是其他方面。 1、你的js是异步的,所以在你主函数结束的时候,handleStateChange还没有开始执行 2、handleStateChange() return回来的数据不是给你StartRequest()的,所以你取回来的数据都是"",因为StartRequest本身就没有返回值。 你先执行StartRequest然后再手动调用一次handleStateChange就可以取到数据了。 不要改成这种,这样没效果的,因为还没有执行完毕,就取数据了。
_variant_t vRet = spScript->Eval(_bstr_t(_T("StartRequest();handleStateChange()")));
或者你这样改:
xmlHttp.open('POST', URL, false);//改成同步

_variant_t vRet = spScript->Eval(_bstr_t(_T("StartRequest();handleStateChange()")));
这些方法我之前都试过了, 这段返回的信息用alert输出来是这样的: 未知错误,可能原因 1.网络问题 2.服务器超时 3.其他原因 出现这个问题,很大可能就是服务器不接受我的数据,或者是Cookie的问题,但就是不知道怎样解决这个问题,因为显示网页的是用Webbrowser,而执行javascript的是msscript.ocx,所以很大的可能是Cookie不同,服务器不接受他不认同的数据的,不知道是不是这个原因,其次就是不知道怎样才能把javascript的代码注入到webbrowser中执行。谢谢 >......[/quote] 应该是被服务器给拒绝了。我之前是在自己的页面上执行这段脚本的,但是一般服务器是不允许跨站执行Js访问后台方法的,所以我后来直接到你URL里的那个页面上执行就可以了。 其他的我就不清楚了,你自己再查查看。
小小虫啊 2014-01-19
  • 打赏
  • 举报
回复
引用 15 楼 Adol1111 的回复:
我检查过了,能取到数据的。不过问题不在这里,而是其他方面。 1、你的js是异步的,所以在你主函数结束的时候,handleStateChange还没有开始执行 2、handleStateChange() return回来的数据不是给你StartRequest()的,所以你取回来的数据都是"",因为StartRequest本身就没有返回值。 你先执行StartRequest然后再手动调用一次handleStateChange就可以取到数据了。 不要改成这种,这样没效果的,因为还没有执行完毕,就取数据了。
_variant_t vRet = spScript->Eval(_bstr_t(_T("StartRequest();handleStateChange()")));
或者你这样改:
xmlHttp.open('POST', URL, false);//改成同步

_variant_t vRet = spScript->Eval(_bstr_t(_T("StartRequest();handleStateChange()")));
这些方法我之前都试过了, 这段返回的信息用alert输出来是这样的: 未知错误,可能原因 1.网络问题 2.服务器超时 3.其他原因 出现这个问题,很大可能就是服务器不接受我的数据,或者是Cookie的问题,但就是不知道怎样解决这个问题,因为显示网页的是用Webbrowser,而执行javascript的是msscript.ocx,所以很大的可能是Cookie不同,服务器不接受他不认同的数据的,不知道是不是这个原因,其次就是不知道怎样才能把javascript的代码注入到webbrowser中执行。谢谢 >......
Adol1111 2014-01-19
  • 打赏
  • 举报
回复
我检查过了,能取到数据的。不过问题不在这里,而是其他方面。 1、你的js是异步的,所以在你主函数结束的时候,handleStateChange还没有开始执行 2、handleStateChange() return回来的数据不是给你StartRequest()的,所以你取回来的数据都是"",因为StartRequest本身就没有返回值。 你先执行StartRequest然后再手动调用一次handleStateChange就可以取到数据了。 不要改成这种,这样没效果的,因为还没有执行完毕,就取数据了。
_variant_t vRet = spScript->Eval(_bstr_t(_T("StartRequest();handleStateChange()")));
或者你这样改:
xmlHttp.open('POST', URL, false);//改成同步

_variant_t vRet = spScript->Eval(_bstr_t(_T("StartRequest();handleStateChange()")));
Adol1111 2014-01-19
  • 打赏
  • 举报
回复
引用 13 楼 zhu_ing 的回复:
[quote=引用 12 楼 Adol1111 的回复:] [quote=引用 9 楼 zhu_ing 的回复:] 抓过包了,信息是正常发出的,但是没信息返回,估计是服务器不接受或者是其他的原因。地址没错,数据格式也没错。
我刚刚在IE下调试了下你这段代码,没有问题。不过输出一直为undefined,后来发现是你的StartRequest()本身并没有返回值。你再最后加一句return http.responseXML就好了。不过因为没有正确的UserID,所以我取到的内容为null,你回去自己再调试下吧。 不过调试好蛋疼,chrome下因为安全原因不能执行这段代码。IE又各种坑爹不习惯...[/quote] 这个我试过了,返回时数据是这样的,就是不知道哪里出了问题 返回数据:{"status":{"code":4004,"msg":"\u672a\u77e5\u9519\u8bef\uff0c\u53ef\u80fd\u7684\u539f\u56e0\uff1a\n1.\u7f51\u7edc\u95ee\u9898\n2.\u670d\u52a1\u5668\u8d85\u65f6\n3.\u5176\u5b83\u539f\u56e0"},"result":null} 我给你一个UserID,我提过几个可用UserID 有 123mn4a 122gzvk 122a0di 1cjl30 122gzvk这五个都是可用,对了我忘记跟你说,测试这个要先登录http://www.mogujie.com/这个网站。你看看能不能帮我解决这个问题,解决了,我给你加分,谢谢 >...[/quote] 这个是Json格式的数据,你希望获取数据是怎样的要先说清楚啊!
小小虫啊 2014-01-19
  • 打赏
  • 举报
回复
引用 12 楼 Adol1111 的回复:
[quote=引用 9 楼 zhu_ing 的回复:] 抓过包了,信息是正常发出的,但是没信息返回,估计是服务器不接受或者是其他的原因。地址没错,数据格式也没错。
我刚刚在IE下调试了下你这段代码,没有问题。不过输出一直为undefined,后来发现是你的StartRequest()本身并没有返回值。你再最后加一句return http.responseXML就好了。不过因为没有正确的UserID,所以我取到的内容为null,你回去自己再调试下吧。 不过调试好蛋疼,chrome下因为安全原因不能执行这段代码。IE又各种坑爹不习惯...[/quote] 这个我试过了,返回时数据是这样的,就是不知道哪里出了问题 返回数据:{"status":{"code":4004,"msg":"\u672a\u77e5\u9519\u8bef\uff0c\u53ef\u80fd\u7684\u539f\u56e0\uff1a\n1.\u7f51\u7edc\u95ee\u9898\n2.\u670d\u52a1\u5668\u8d85\u65f6\n3.\u5176\u5b83\u539f\u56e0"},"result":null} 我给你一个UserID,我提过几个可用UserID 有 123mn4a 122gzvk 122a0di 1cjl30 122gzvk这五个都是可用,对了我忘记跟你说,测试这个要先登录http://www.mogujie.com/这个网站。你看看能不能帮我解决这个问题,解决了,我给你加分,谢谢 >...
Adol1111 2014-01-19
  • 打赏
  • 举报
回复
引用 9 楼 zhu_ing 的回复:
抓过包了,信息是正常发出的,但是没信息返回,估计是服务器不接受或者是其他的原因。地址没错,数据格式也没错。
我刚刚在IE下调试了下你这段代码,没有问题。不过输出一直为undefined,后来发现是你的StartRequest()本身并没有返回值。你再最后加一句return http.responseXML就好了。不过因为没有正确的UserID,所以我取到的内容为null,你回去自己再调试下吧。 不过调试好蛋疼,chrome下因为安全原因不能执行这段代码。IE又各种坑爹不习惯...
小小虫啊 2014-01-18
  • 打赏
  • 举报
回复
引用 10 楼 jerry_dqh 的回复:
[quote=引用 8 楼 zhu_ing 的回复:] [quote=引用 5 楼 jerry_dqh 的回复:] 抓个包看一下,你的程序发出的报文是否发出去了,是否解析正确
抓过了,信息是正常发出的,但是就是没有信息返回来。[/quote] 那就奇怪了,仔细对一下数据,发出的地址等字段都是正确的。或者使用真实的方式抓包看一下。 如果是http协议,前面的tcp连接你建立了吗,如果没有连接,你直接发一个报文,服务器不会返回的。[/quote] 在原网站也抓过包了,跟我写的程序发出去的头部信息和内容都是一模一样。是执行javascript代码发出去的,不需建立tcp连接。
碼上道 2014-01-18
  • 打赏
  • 举报
回复
引用 8 楼 zhu_ing 的回复:
[quote=引用 5 楼 jerry_dqh 的回复:] 抓个包看一下,你的程序发出的报文是否发出去了,是否解析正确
抓过了,信息是正常发出的,但是就是没有信息返回来。[/quote] 那就奇怪了,仔细对一下数据,发出的地址等字段都是正确的。或者使用真实的方式抓包看一下。 如果是http协议,前面的tcp连接你建立了吗,如果没有连接,你直接发一个报文,服务器不会返回的。
小小虫啊 2014-01-18
  • 打赏
  • 举报
回复
引用 6 楼 Adol1111 的回复:
在MFC调用Javascript实在蛋疼...不如用QT webkit来编程。 你这里应该是Javascript执行错误抛异常了,一般Js出问题了,都不会继续执行,会直接退出的。一般遇到这种问题我喜欢这样做:

function func(){
    try{
        ……//你原来的代码
    }catch(e){//接收异常信息
        alert(e);//你这里改成return e也可以
    }
}
当然,如果可以在浏览器里直接打开的话,用firebug之类的直接调试是最好的。
抓过包了,信息是正常发出的,但是没信息返回,估计是服务器不接受或者是其他的原因。地址没错,数据格式也没错。
小小虫啊 2014-01-18
  • 打赏
  • 举报
回复
引用 5 楼 jerry_dqh 的回复:
抓个包看一下,你的程序发出的报文是否发出去了,是否解析正确
抓过了,信息是正常发出的,但是就是没有信息返回来。
赵4老师 2014-01-17
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。
threenewbee 2014-01-17
  • 打赏
  • 举报
回复
http://www.vckbase.com/index.php/wv/1204
加载更多回复(5)

64,318

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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