• 使用chttpfile的一个错误


    先贴一部分代码

      CString strHttpName="http://localhost/TestReg/RegForm.aspx"; // 需要提交数据的页面
      CString strFormData = "username=abc&password=123";    // 需要提交的数据
    
      CInternetSession sess;
      CHttpFile
    * fileGet;
      CString strHeaders
    = _T("Content-Type: application/x-www-form-urlencoded"); // 请求头 try { fileGet=(CHttpFile*)sess.OpenURL(strHttpName);//打开文件 } catch(CException* e) { fileGet = 0; throw; } CString strSentence, strGetSentence = ""; if(fileGet) { DWORD dwStatus; DWORD dwBuffLen = sizeof(dwStatus); BOOL bSuccess = fileGet->QueryInfo(HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwStatus, &dwBuffLen); if( bSuccess && dwStatus>= 200 &&dwStatus<300 ) {
    BOOL result
    = fileGet->SendRequest(strHeaders, (LPVOID)(LPCTSTR)strFormData, strFormData.GetLength());

           while(fileGet->ReadString(strSentence)) // 读取提交数据后的返回结果 { strGetSentence = strGetSentence + strSentence + char(13) + char(10); } AfxMessageBox(strGetSentence); // 显示返回网页内容 } else { strSentence.Format("POST出错,错误码:%d", dwStatus); AfxMessageBox(strSentence); } fileGet->Close(); delete fileGet; } else AfxMessageBox("不能找到网页文件!"); sess.Close();

    因为需要使用post方式抓取某个网页返回的内容,所以找了MFC中功能不是那么强大的CHttpFile来做,也够用了。

    一般网络编程的demo都是ANSI字符集的,也都没什么问题,上面的代码改改也能用,拿到unicode的工程里,将加上_T标示符以及进行些字符集转换,很快就能运行了,但问题来了,就是发送的request总不能使服务器正确接受,而返回一些错误,这一调试不要紧,2个小时就过去了。

    最后在改php程序和MFC程序的情况下,把问题锁定在了带下划线的代码处,在ansi时发送的是char字符,是没有问题的,而在unicode情况下,发过去就是wchar字符,而编译又不会报错,即使在unicode版本中,这个函数也是希望接受char字符的。

    哎,库函数写成这样,真是够奇芭的。

    如果收到的数据是乱码,先确定是什么格式的码,一般为utf_8,可以使用MultiByteToWideChar转换:

    CString str;
    pHttpFile->ReadString(str);
    
    char *pStr = str.GetBuffer(str.GetLength()); //取得str对象的原始字符串
    int nBufferSize = MultiByteToWideChar(CP_UTF8, 0, pStr, -1, NULL, 0); //取得所需缓存的多少
    wchar_t *pBuffer = (wchar_t*)malloc(nBufferSize * sizeof(wchar_t));//申请缓存空间
    MultiByteToWideChar(CP_UTF8, 0, pStr, -1 , pBuffer, nBufferSize*sizeof(wchar_t));//转码
    MessageBoxW(NULL, pBuffer, L"Text", MB_OK); //显示
    free(pBuffer); //释放缓存
  • 相关阅读:
    C++中volatile及编译器优化
    virtualbox 复制虚拟机提示uuid is exists
    Opencv实现简易播放器
    机器学习 Hidden Markov Models 2
    MFC显示Mat图片
    HDU 1518 Square
    马的遍历问题
    JAVA反射机制
    UNIX基础知识
    开机黑屏 仅仅显示鼠标 电脑黑屏 仅仅有鼠标 移动 [已成功解决]
  • 原文地址:https://www.cnblogs.com/liaocheng/p/4254635.html
Copyright © 2020-2023  润新知