首先,在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解决方法相关推荐

  1. ajax get 不会缓存,ajax的get请求时缓存处理解决方法

    ajax的get请求时缓存处理解决方法 本文实例讲述了ajax的get请求时缓存处理解决方法.分享给大家供大家参考.具体分析如下: 很多时候在Ajax的get方法调用的时候由于缓存的原因无法及时获取正 ...

  2. C# .net中cookie值为中文时的乱码解决方法

    C# .net中cookie值为中文时的乱码解决方法 一.cookie的名称或子cookie的名称不能为中文,否则无法获得cookie 这个好办,名称不用中文即可 二.cookie的值为中文时候,取c ...

  3. 安装VM虚拟机提示 尝试创建目录 C:\Public\documents\SharedVirtual Machines 时发生错误解决方法

    安装VM虚拟机提示 尝试创建目录 C:\Public\documents\SharedVirtual Machines 时发生错误解决方法 参考文章: (1)安装VM虚拟机提示 尝试创建目录 C:\P ...

  4. python使用退格键时出现^H解决方法

    python使用退格键时出现^H解决方法 参考文章: (1)python使用退格键时出现^H解决方法 (2)https://www.cnblogs.com/effortsing/p/9982040.h ...

  5. ”dpkg: 处理归档 /var/cache/apt/archives/XXXXXX(--unpack)时出错“的解决方法

    "dpkg: 处理归档 /var/cache/apt/archives/XXXXXX(--unpack)时出错"的解决方法 参考文章: (1)"dpkg: 处理归档 /v ...

  6. mysql编写中文时变成问号解决方法

    mysql编写中文时变成问号解决方法 参考文章: (1)mysql编写中文时变成问号解决方法 (2)https://www.cnblogs.com/yangzhixue/p/11449525.html ...

  7. PLSQL 查询结果只显示年月日不显示时分秒的解决方法

    PLSQL 14查询结果只显示年月日不显示时分秒的解决方法 如果plsql里面日期显示出现混乱,并且按照一般的调整首选项里日期格式调整不了,可以修改环境变量,新建环境变量,变量名:nls_date_f ...

  8. centos下MySQL Workbench连接时崩溃的解决方法

    centos下MySQL Workbench连接时崩溃的解决方法 参考文章: (1)centos下MySQL Workbench连接时崩溃的解决方法 (2)https://www.cnblogs.co ...

  9. [转] linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决,Linux使用退格键时出现^H解决方法

    [转] linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决,Linux使用退格键时出现^H解决方法 参考文章: (1)[转] linux下shell ...

最新文章

  1. Elasticsearch Top 51 重中之重面试题及答案
  2. python篮球-用Python让蔡徐坤在我的命令行里打篮球!|附完整代码
  3. 初学python还是swift-Python并不完美,Swift正在成长为深度学习语言 !
  4. 3.6 BatchNorm 为什么起作用-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授
  5. emqtt 试用(二)验证 emq 和 mosquito 的共享订阅
  6. AbstractListView源码分析4
  7. 苹果、联想及华硕均看准美国电脑运输的增长
  8. 澄海哪里学机器人编程_少年学机器人编程
  9. webpack快速入门教程
  10. Web Api 中使用 PCM TO WAV 的语音操作
  11. sql查询重复记录、删除重复记录方法大全
  12. [渝粤教育] 西南科技大学 管理会计JG211012 在线考试复习资料2021版
  13. linux下安装sqlite3
  14. POJ 1088滑雪(3种解法)
  15. npm 安装出现 UNMET DEPENDENCY 的解决方案
  16. 校园跑腿小程序市场需要和功能分析!
  17. 【PS】图片背景透明化
  18. vps服务器租用费用
  19. VHDL和Verilog HDL的区别
  20. SCON串行使用波特率计算和设置

热门文章

  1. 深度学习之BP神经网络
  2. 编程资源 : vc6英文企业版完整版5CD
  3. 林子雨—大数据技术原理与应用—上机实验二
  4. 在Flutter中使用自定义字体,等宽字体
  5. GAN网络系列博客(三):不受坐标限制的GAN(StyleGAN3)
  6. u盘不能拷贝超过4g的大文件吗?
  7. linux系统下修改文件命令vi的使用
  8. 教大家如何安装win to go
  9. 关于Java RDP协议实现远程桌面连接的开源项目properjavardp
  10. Chrome插件-浏览器插件开发-插件安装-插件调试-概述