LPWSTR AnsiToUnicode(LPCSTR lpcstr)   //参数lpcstr类型也可是char*

    LPWSTR Pwstr;
    int  Cb,i;
    Cb=strlen(lpcstr)*sizeof(LPCSTR);
    Pwstr=LocalAlloc(LMEM_FIXED,Cb); 

    i=MultiByteToWideChar(CP_ACP,0,lpcstr,-1,Pwstr,0);
    MultiByteToWideChar(CP_ACP,0,lpcstr,-1,Pwstr,i); return (Pwstr);
}
函数功能:将ANSI转换成UNICODE:问题如下:1:首先此函数运行正常,但有一个缺点(个人观点),那就是在用  Cb=strlen(lpcstr)*sizeof(LPCSTR);函数分配固定内存时,多分配了内存,造成内存浪费。个人认为:应这样写Cb=2*(strlen(lpcstr)+1);
不知有错没有,请各位指教。
2:如果Cb=strlen(lpcstr);这样程序照样运行正常,但实际上分配的固定内存并不够,不够的部分占用了堆中其它未用的内存快。这部分内存快很容易被其他人分配用掉,所以Pwstr值很有可能会被冲掉(冲掉的是未够分配的内存)。
不知以上分析的对不对,请各位指教

解决方案 »

  1.   

    windows核心编程
    对这个问题有纤细的描述可以看看!
      

  2.   

    LPWSTR AnsiToUnicode(char* lpcstr)   //参数lpcstr类型也可是char*

        LPWSTR Pwstr;
        int  i;
        i=MultiByteToWideChar(CP_ACP,0,lpcstr,-1,NULL,0);
        Pwstr=new WCHAR[i]; 
        MultiByteToWideChar(CP_ACP,0,lpcstr,-1,Pwstr,i);

         return (Pwstr);
    }顺便说一下,你这种在程序内部new、外部释放的做法如果不明显说明的话非常容易引起内存泄漏!
      

  3.   

    你可以按你的想法试着用Cb=2*strlen(lpcstr)+1看是否正确
      

  4.   

    应这样写Cb=2*(strlen(lpcstr)+1);
    不知有错没有,请各位指教。这样应该是错误的,在第一个
    i=MultiByteToWideChar(CP_ACP,0,lpcstr,-1,Pwstr,0);
    Return Values
    If the function succeeds, and cchWideChar is nonzero, the return value is the number of wide characters written to the buffer pointed to by lpWideCharStr. If the function succeeds, and cchWideChar is zero, the return value is the required size, in wide characters, for a buffer that can receive the translated string. 
    已经取得了宽字节的大小。
      

  5.   

    to bluebohe(薄荷):顺便说一下,你这种在程序内部new、外部释放的做法如果不明显说明的话非常容易引起内存泄漏!----------------------------------------------------------------------------
    那应该怎样写啊?请指教?Cb=strlen(lpcstr)*sizeof(LPCSTR);这样写是不是浪费了内存?请指教?