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

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;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值