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) { //error
return 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;
}
}