windows下unicode传参及CString解惑 及环境变量设置

来源:互联网 发布:图腾9u网络机柜 编辑:程序博客网 时间:2024/06/18 13:59
char test[] = "本地编码字符串";wchar_t test2[] = L"UNICODE宽字符编码";CString testStr = CString(test);CString testStr2 = CString(test2);CString testStr3 = CString((unsigned char*)test2);




1.unicode传递参数给空项目的int main (int, char**), 程序收到的参数是经过windows编码转换的本地编码char*
2.CString的构造函数可以传递wchar*和unsigned char*,当传入wchar*时构造函数会按照unicode处理是肯定的,当传入unsigned char*时构造函数按照本地多字节编码来解释
  至于内部的tchar结构把数据存成wchar_t还是char就根据是否宏定义了UNICODE来决定了
 http://msdn.microsoft.com/en-us/library/aa314317%28v=VS.60%29.aspx

3.CString可以直接传递给const char* 或 const wchar_t*类型的函数参数,没定义UNICODE就可以直接传递给前者,定义了就可以直接传递给后者。当然了,如果是TCHAR*类型的参数可以随意传


增加环境变量(比如往PATH中加入可执行文件的路径,另,CreateProcess时候不特别指明时子进程继承父进程的环境变量)

bool AddEnviroment(const CString& varName, const CString& newValue){DWORD bufferLen = 4096;LPTSTR pszOldVal = (LPTSTR) malloc(bufferLen*sizeof(TCHAR));if(NULL == pszOldVal)return false;DWORD dwRet = GetEnvironmentVariable(varName, pszOldVal, bufferLen);if(0 == dwRet) {free(pszOldVal);return false;}else if(bufferLen < dwRet){pszOldVal = (LPTSTR) realloc(pszOldVal, dwRet*sizeof(TCHAR));   if(NULL == pszOldVal) {free(pszOldVal);return false;}dwRet = GetEnvironmentVariable(varName, pszOldVal, dwRet);if(!dwRet) {free(pszOldVal);return false;}}CString oldVal(pszOldVal);free(pszOldVal);if (oldVal.Find(newValue) == -1) {oldVal += TEXT(";") + newValue;if ( !SetEnvironmentVariable(varName, oldVal) )return false;}return true;}


获取当前启动程序的路径

bool GetExePath(CString& path){path.Truncate(0);DWORD bufferLen = MAX_PATH;TCHAR* buffer = new TCHAR[bufferLen];while (true) {DWORD lenRt = GetModuleFileName(NULL, buffer, bufferLen-1);if (lenRt == 0) { //errorreturn false;}else {if (lenRt == bufferLen-1) {delete[] buffer;bufferLen = bufferLen + bufferLen/2;buffer = new TCHAR[bufferLen];continue;}else {buffer[lenRt] = _T('\0');break;}}}path = CString(buffer);path = path.Left(path.ReverseFind('\\')+1);return true;}


获取当前目录

bool GetCurentDir(CString& path){TCHAR dirBuffer[MAX_PATH];DWORD dwRet = GetCurrentDirectory(MAX_PATH, dirBuffer);if( dwRet == 0 ){return false;}if(dwRet > MAX_PATH-1){TCHAR* newBuffer = (TCHAR*)malloc(sizeof(TCHAR)*dwRet);DWORD rt = GetCurrentDirectory(dwRet, newBuffer);if (rt == 0) {free(newBuffer);return false;}assert(rt==dwRet-1);path = CString(newBuffer);free(newBuffer);return true;} else {path = CString(dirBuffer);return true;}}