Win95+VC6+IE4+MSXML3时的XMLHTTP解决方法
首先,在Win95+VC6+IE4+MSXML3下,使用MSXML3的XMLHTTP在open时会发生错误(抛出异常,异常码为EFAIL,异常描述为空),个人认为是wininet和urlmon的问题(本人并未深入确认,本想安装IE5/5.5再测试,但无奈该版本太古老,找不到安装包,只能找到所谓绿色版)。
既然MSXML3的XMLHTTP无法使用,只好使用CInternetSession自行编写了:
void Send(Joytech::MSXML3::IXMLDOMDocument documentSend, const CString& url, const CString& soapAction, Joytech::MSXML3::IXMLDOMDocument& documentRecv)
{
static LPCTSTR header = _T("Accept: */*\r\n\
Accept-Language: zh-cn\r\n\
X-Requested-With: TWenXMLHttpRequest\r\n\
Content-Type: text/xml; charset=UTF-8\r\n\
UA-CPU: x86\r\n\
Accept-Encoding: gzip, deflate\r\n\
SOAPAction: ");
CString strHeader = header + soapAction + _T("\r\n");
DWORD dwServiceType;
CString strServer, strObject;
INTERNET_PORT nPort = 80;
//vc6版本的AfxParseURL不支持INTERNET_SERVICE_HTTPS
if (!AfxParseURL(url, dwServiceType, strServer, strObject, nPort) || (dwServiceType != INTERNET_SERVICE_HTTP))
throw new Joytech::Exception::CJoytechException(_T("url中的协议出错!"));
CString xml = documentSend.GetXml();
CInternetSession session;
CHttpConnection* pConnection = session.GetHttpConnection(strServer, nPort);
CHttpFile* pFile = pConnection->OpenRequest(CHttpConnection::HTTP_VERB_POST, strObject);
pFile->SendRequest(strHeader, (LPVOID)(LPCTSTR)xml, xml.GetLength() * sizeof(TCHAR));
DWORD dwRet;
pFile->QueryInfoStatusCode(dwRet);
if(dwRet != HTTP_STATUS_OK) throw new Joytech::Exception::CJoytechException(_T("XMLHTTP状态出错!"));
CString strXML;
int nSize = pFile->GetLength();
{
CString strRead;
while(pFile->ReadString(strRead)) strXML += strRead;
}
pFile->Close();
delete pFile;
pConnection->Close();
delete pConnection;
session.Close();
Joytech::MSXML3::CreateXMLDocument(documentRecv);
documentRecv.loadXML(Joytech::StringConvert::Joytech_UTF82T((LPCSTR)strXML));//strXML虽然是CString类型,但内部的数据其实是UTF8(依赖于WebService服务器的xml序列化编码)的格式,因此需要手动转换为LPCTSTR格式
}
其中有两点需要注意:
1. 如果要支持https等协议,必须自行编写URL解析函数,因为VC6版本的URL解析函数AfxParseURL仅支持INTERNET_SERVICE_URL、INTERNET_SERVICE_FTP、INTERNET_SERVICE_GOPHER和INTERNET_SERVICE_HTTP四种。
2. 对于从服务器端返回的数据,虽然在代码中是使用pFile->ReadString取得的,并且是CString类型,但并不能简单地将之作为CString处理;一定要注意到,返回的xml文本是有编码的,一般为utf8!并且,在转换编码为LPCTSTR时,需要注意,Win95下的API函数MultiByteToWideChar/WideCharToMultiByte不支持UTF8,因此需要自己编写。
Win95+VC6+IE4+MSXML3时的XMLHTTP解决方法相关推荐
- ajax get 不会缓存,ajax的get请求时缓存处理解决方法
ajax的get请求时缓存处理解决方法 本文实例讲述了ajax的get请求时缓存处理解决方法.分享给大家供大家参考.具体分析如下: 很多时候在Ajax的get方法调用的时候由于缓存的原因无法及时获取正 ...
- C# .net中cookie值为中文时的乱码解决方法
C# .net中cookie值为中文时的乱码解决方法 一.cookie的名称或子cookie的名称不能为中文,否则无法获得cookie 这个好办,名称不用中文即可 二.cookie的值为中文时候,取c ...
- 安装VM虚拟机提示 尝试创建目录 C:\Public\documents\SharedVirtual Machines 时发生错误解决方法
安装VM虚拟机提示 尝试创建目录 C:\Public\documents\SharedVirtual Machines 时发生错误解决方法 参考文章: (1)安装VM虚拟机提示 尝试创建目录 C:\P ...
- python使用退格键时出现^H解决方法
python使用退格键时出现^H解决方法 参考文章: (1)python使用退格键时出现^H解决方法 (2)https://www.cnblogs.com/effortsing/p/9982040.h ...
- ”dpkg: 处理归档 /var/cache/apt/archives/XXXXXX(--unpack)时出错“的解决方法
"dpkg: 处理归档 /var/cache/apt/archives/XXXXXX(--unpack)时出错"的解决方法 参考文章: (1)"dpkg: 处理归档 /v ...
- mysql编写中文时变成问号解决方法
mysql编写中文时变成问号解决方法 参考文章: (1)mysql编写中文时变成问号解决方法 (2)https://www.cnblogs.com/yangzhixue/p/11449525.html ...
- PLSQL 查询结果只显示年月日不显示时分秒的解决方法
PLSQL 14查询结果只显示年月日不显示时分秒的解决方法 如果plsql里面日期显示出现混乱,并且按照一般的调整首选项里日期格式调整不了,可以修改环境变量,新建环境变量,变量名:nls_date_f ...
- centos下MySQL Workbench连接时崩溃的解决方法
centos下MySQL Workbench连接时崩溃的解决方法 参考文章: (1)centos下MySQL Workbench连接时崩溃的解决方法 (2)https://www.cnblogs.co ...
- [转] linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决,Linux使用退格键时出现^H解决方法
[转] linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决,Linux使用退格键时出现^H解决方法 参考文章: (1)[转] linux下shell ...
最新文章
- Elasticsearch Top 51 重中之重面试题及答案
- python篮球-用Python让蔡徐坤在我的命令行里打篮球!|附完整代码
- 初学python还是swift-Python并不完美,Swift正在成长为深度学习语言 !
- 3.6 BatchNorm 为什么起作用-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
- emqtt 试用(二)验证 emq 和 mosquito 的共享订阅
- AbstractListView源码分析4
- 苹果、联想及华硕均看准美国电脑运输的增长
- 澄海哪里学机器人编程_少年学机器人编程
- webpack快速入门教程
- Web Api 中使用 PCM TO WAV 的语音操作
- sql查询重复记录、删除重复记录方法大全
- [渝粤教育] 西南科技大学 管理会计JG211012 在线考试复习资料2021版
- linux下安装sqlite3
- POJ 1088滑雪(3种解法)
- npm 安装出现 UNMET DEPENDENCY 的解决方案
- 校园跑腿小程序市场需要和功能分析!
- 【PS】图片背景透明化
- vps服务器租用费用
- VHDL和Verilog HDL的区别
- SCON串行使用波特率计算和设置