你好,我有一个问题,下面这段代码,使用WinInet,通过代理取Google首页的数据,在MBCS下可以正常通过,UNICODE下却不行,请问是什么原因? TCHAR szProxy[MAX_PATH]=_T("127.0.0.1:9666");
CInternetSession session;
CHttpConnection* pConnection = NULL;
CHttpFile* pHttpFile = NULL;
DWORD dwStart = GetTickCount();
DWORD dwServiceType = AFX_INET_SERVICE_HTTP;
CString strServer;
CString strObject;
INTERNET_PORT nPort;
AfxParseURL( _T("http://www.google.com/"),dwServiceType,strServer,strObject,nPort );

CString strAllData;
BOOL bInvalid = FALSE;
try
{
pConnection = session.GetHttpConnection(strServer,INTERNET_FLAG_KEEP_CONNECTION,INTERNET_INVALID_PORT_NUMBER,NULL, NULL);
pHttpFile = pConnection->OpenRequest(_T("GET"), strObject,NULL, 0, NULL, NULL,INTERNET_FLAG_KEEP_CONNECTION);
INTERNET_PROXY_INFO proxyinfo;
proxyinfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
proxyinfo.lpszProxy = szProxy;
proxyinfo.lpszProxyBypass = NULL;
session.SetOption(INTERNET_OPTION_PROXY, (LPVOID)&proxyinfo, sizeof(INTERNET_PROXY_INFO));
session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,1000 * 10);
session.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT,1000 * 20);
pHttpFile->SendRequest(NULL);
DWORD nFileSize = pHttpFile->GetLength();
char *rBuffer = new char[nFileSize];
int nRead = pHttpFile->Read(rBuffer, nFileSize);
pHttpFile->Close();
strAllData = rBuffer;
strAllData.SetAt(nRead,0);
delete rBuffer;
delete pHttpFile;
pConnection->Close();
delete pConnection;
session.Close();
}
catch (CInternetException* e)
{
bInvalid = TRUE;
TCHAR szError[MAX_PATH];
e->GetErrorMessage(szError,MAX_PATH);
e->Delete();
if (pHttpFile)
{
pHttpFile->Close();
delete pHttpFile;
}
if (pConnection)
{
pConnection->Close();
delete pConnection;
}
session.Close();
}
AfxMessageBox(strAllData);

解决方案 »

  1.   

    问题出在3及4行上:
    1:char *rBuffer= new char[nFileSize];
    2:int nRead = pHttpFile->Read(rBuffer, nFileSize);
    3:strAllData = rBuffer;
    4:strAllData.SetAt(nRead,0);
    unicode是两个字节表示一个字符,而char是一个字节表示一个字符,
    这两句话在MBCS下可以正常通过,说明对方过来的数据也是多字节的数据流,而你把多字节字符集(MBCS)直接赋值给Unicode字符串strAllData,出来的一定是乱字符。解决办法:将3及4行改为
    #ifdef _UNICODE
    ::MultiByteToWideChar(CP_OEMCP , MB_COMPOSITE , rBuffer , nRead , strAllData.GetBuffer(nRead+1) , nRead+1);
    #endif
    在使用完strAllData后添加下面的代码
    #ifdef _UNICODE
      strAllData.ReleaseBuffer( );
    #endif
      

  2.   

    有两句写漏了。解决办法:将3及4行改为
    #ifdef _UNICODE
    ::MultiByteToWideChar(CP_OEMCP , MB_COMPOSITE , rBuffer , nRead , strAllData.GetBuffer(nRead+1) , nRead+1);
    #else
    strAllData= rBuffer;
    #endif
    strAllData.SetAt(nRead,0);
      

  3.   

    问题不是这个啊
    CString 可以自动转换 MBCS 到Unicode ,设置断点会发现
    是在这里出问题
    pHttpFile->SendRequest(NULL);然后抛出异常
      

  4.   

    而且如果我把这句注释了
    session.SetOption(INTERNET_OPTION_PROXY, (LPVOID)&proxyinfo, sizeof(INTERNET_PROXY_INFO));
    或者在MBCS下编译就可以正常取到数据