#include <windows.h>
#include "Wininet.h"
# pragma comment(lib, "Wininet.lib")void    GetProxyOptions(TCHAR *tcProxyFullInfo,DWORD &dwBufLen)
{
DWORD dwSize;
InternetQueryOption(NULL,INTERNET_OPTION_PROXY ,NULL,&dwSize);
dwBufLen = dwSize; if(!tcProxyFullInfo)
return; LPVOID lpData = new TCHAR[dwSize]; InternetQueryOption( NULL, 
INTERNET_OPTION_PROXY ,
lpData,&dwSize ); wcscpy_s(tcProxyFullInfo,dwSize,((INTERNET_PROXY_INFO*)lpData)->lpszProxy); delete [] lpData;
}int _tmain(int argc, _TCHAR* argv[])
{
DWORD dwBufLen = 0;
GetProxyOptions(NULL,dwBufLen); TCHAR *tcTemp = new TCHAR[dwBufLen];// * sizeof(TCHAR));
GetProxyOptions(tcTemp,dwBufLen);

//printf("3 %s",tcTemp);  //此处显示正常---------------------------------1

MessageBox(NULL,tcTemp,NULL,NULL);//messagebox 显示乱码-------------------2
delete[] tcTemp;
tcTemp = NULL; return 0;
}
上面1处在控制台中输出正常,而在2出用messagebox输出乱码。我的工程本身是Unicode的。GetProxyOptions函数的作用是获得浏览器中“工具”-》Internet选项-》连线-》局域网设定-》Proxycn中的代理服务器地址和端口号的。

解决方案 »

  1.   

    如果printf("%s"正常的话那么说明得到的字符串是非unicode编码的。
      

  2.   

    但是在Unicode下 
    wcscpy_s(tcProxyFullInfo,dwSize,((INTERNET_PROXY_INFO*)lpData)->lpszProxy);
    中的lpszProxy是LPCTSTR类型的……
      

  3.   

    在2处我应该怎样处理一下呢?
    MultiByteToWideChar?但是tcTemp 本身已经是TCHAR类型了……
      

  4.   

    不妨试试先把它转成char*然后MultiByteToWideChar
      

  5.   

    我试过了,用MultiByteToWideChar转了一下就好了。看来是我自己把概念给弄混淆了。
    字符编码跟Unicode的工程没有关系,而我错误的弄成TCHAR*保存的字符串一定是Unicode的。
      

  6.   

    typedef struct {
        DWORD dwAccessType;
        LPCSTR lpszProxy;
        LPCSTR lpszProxyBypass;
    } INTERNET_PROXY_INFO, * LPINTERNET_PROXY_INFO;
    lpszProxy 不是宽字, 用wcscpy不对