vc开发常用的自定义函数,持续更新。。。

编码转换函数

vc下用的编码转换函数。我是在mfc下写的,不需要另外包括头文件。ANSI和Unicode间转换,UTF8和Unicode间的转换,如果想ANSI跟UTF8转就得先转成Unicode。经过我多次修正。我现在只要需要转换编码的就直接copy就程序就行了。MFC下测试可用

wchar_t * ANSIToUnicode( const char* str )
{
      int    textlen ;
      wchar_t * result;
      textlen = MultiByteToWideChar( CP_ACP, 0, str,-1,    NULL,0 );  
      result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));  
      memset(result,0,(textlen+1)*sizeof(wchar_t));  
      MultiByteToWideChar(CP_ACP, 0,str,-1,(LPWSTR)result,textlen );  
      return    result;  
}

char * UnicodeToANSI( const wchar_t *str )
{
      char * result;
      int textlen;
      // wide char to multi char
      textlen = WideCharToMultiByte( CP_ACP,    0,    str,    -1,    NULL, 0, NULL, NULL );
      result =(char *)malloc((textlen+1)*sizeof(char));
      memset( result, 0, sizeof(char) * ( textlen + 1 ) );
      WideCharToMultiByte( CP_ACP, 0, str, -1, result, textlen, NULL, NULL );
      return result;
}

wchar_t * UTF8ToUnicode( const char* str )
{
      int    textlen ;
      wchar_t * result;
      textlen = MultiByteToWideChar( CP_UTF8, 0, str,-1,    NULL,0 );  
      result = (wchar_t *)malloc((textlen+1)*sizeof(wchar_t));  
      memset(result,0,(textlen+1)*sizeof(wchar_t));  
      MultiByteToWideChar(CP_UTF8, 0,str,-1,(LPWSTR)result,textlen );  
      return    result;  
}

char * UnicodeToUTF8( const wchar_t *str )
{
      char * result;
      int textlen;
      // wide char to multi char
      textlen = WideCharToMultiByte( CP_UTF8,    0,    str,    -1,    NULL, 0, NULL, NULL );
      result =(char *)malloc((textlen+1)*sizeof(char));
      memset(result, 0, sizeof(char) * ( textlen + 1 ) );
      WideCharToMultiByte( CP_UTF8, 0, str, -1, result, textlen, NULL, NULL );
      return result;
} 

如果用CString的Find函数寻找关键字时,如果buff里面有中文或者vc不能识别的编码方式,有可能会跳过你要找的关键字,所以说不是什么时候都能用Find,我针对上述问题写了个简单的CString的查询函数,直接复制到代码里面就能用。MFC下测试可用

//
函数名:cstringcmd
描述:寻找CString 中关键字的位置
参数:databuf 数据段 pos1=开始位置 cmd=关键字
返回值:-1表示没有找到 正数表示位置,0开始
//
int cstringcmd(CString databuf, char *cmd, int pos1)
{
	int len = databuf.GetLength();
	if(0 == len || NULL == cmd )
		return -1;
	len--;
	int i = 0;
	
	while(len >= pos1)
	{
		i = 0;
		while(databuf[pos1+i] == cmd[i])
		{
			i++;
			
			if(0 == cmd[i])
				return pos1;
			if(len < pos1+i)
				return -1;
		}
		pos1++;
	}
	return -1;
}


注册表操作.MFC下测试可用

//
//写注册表的指定键的数据
//	MainKey 主项名,如:HKEY_CURRENT_USER
//	SubKey	项的路径,如:"Software\\Skype\\Phone\\UI\\General"
//	Vname	键的名字,如:"LastLanguage"
//	Type	键的类型,如:REG_SZ
//	szData	键的内容,如:"en"
//	dwData	键的内容,应该是数字
//	Mode:0-新建键数据 1-设置键数据 2-删除指定键 3-删除指定键项
//	例子:创建项:WriteRegEx(HKEY_CURRENT_USER,"Software\\Skype\\Phone\\UI\\General",NULL,0,NULL,0,0);
//	例子:创建键值或修改:WriteRegEx(HKEY_CURRENT_USER,"Software\\Skype\\Phone\\UI\\General","LastLanguage",REG_SZ,"en",0,1);
int WriteRegEx(HKEY MainKey,LPCTSTR SubKey,LPCTSTR Vname,DWORD Type,char* szData,DWORD dwData,int Mode)
{
	HKEY  hKey; 
	DWORD dwDisposition;    
	int   iResult =0;
	
	__try
	{	
		//	SetKeySecurityEx(MainKey,Subkey,KEY_ALL_ACCESS);
		switch(Mode)		
		{			
		case 0:
			if(RegCreateKeyEx(MainKey,SubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS,NULL,&hKey,&dwDisposition) != ERROR_SUCCESS)
				__leave;		 
		case 1:	
			if(RegOpenKeyEx(MainKey,SubKey,0,KEY_READ|KEY_WRITE,&hKey) != ERROR_SUCCESS)					 
				__leave;		 		 			 
			switch(Type)
			{		 
			case REG_SZ:		 
			case REG_EXPAND_SZ:			 			 
				if(RegSetValueEx(hKey,Vname,0,Type,(LPBYTE)szData,strlen(szData)+1) == ERROR_SUCCESS) 				 
					iResult =1;				 			
				break;
			case REG_DWORD:
				if(RegSetValueEx(hKey,Vname,0,Type,(LPBYTE)&dwData,sizeof(DWORD)) == ERROR_SUCCESS)  
					iResult =1;				 			 
				break;
			case REG_BINARY:
				break;
			}
			break;				
		case 2:
			if(RegOpenKeyEx(MainKey,SubKey,NULL,KEY_READ|KEY_WRITE,&hKey) != ERROR_SUCCESS)				
				__leave;                
			if (RegDeleteKey(hKey,Vname) == ERROR_SUCCESS)		        
				iResult =1;
			break;		
		case 3:
			if(RegOpenKeyEx(MainKey,SubKey,NULL,KEY_READ|KEY_WRITE,&hKey) != ERROR_SUCCESS)				
				__leave;                
			if (RegDeleteValue(hKey,Vname) == ERROR_SUCCESS)		        
				iResult =1;
			break;
		}
	}
	__finally 
	{
		RegCloseKey(MainKey);		
		RegCloseKey(hKey);
	}
	return iResult;
}
//这是一个注册表读的例子。。易懂易用。
void regread()
{
	HKEY hKEY;
	//定义有关的 hKEY, 在查询结束时要关闭。
	LPCTSTR data_Set="Software\\Microsoft\\Windows\\CurrentVersion\\";
	//打开与路径 data_Set 相关的 hKEY,第一个参数为根键名称,第二个参数表。
	//表示要访问的键的位置,第三个参数必须为0,KEY_READ表示以查询的方式。
	//访问注册表,hKEY则保存此函数所打开的键的句柄。
	long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set, 0, KEY_READ, &hKEY));
	if(ret0!=ERROR_SUCCESS) //如果无法打开hKEY,则终止程序的执行
	{
		//	::MessageBox("错误: 无法打开有关的hKEY!");
		return;
	}
	//查询有关的数据 (用户姓名 owner_Get)。
	LPBYTE owner_Get=new BYTE[80];
	DWORD type_1=REG_SZ ; DWORD cbData_1=80; 
	//hKEY为刚才RegOpenKeyEx()函数所打开的键的句柄,"RegisteredOwner"。
	//表示要查 询的键值名,type_1表示查询数据的类型,owner_Get保存所。
	//查询的数据,cbData_1表示预设置的数据长度。
	long ret1=::RegQueryValueEx(hKEY, "RegisteredOwner", NULL, &type_1, owner_Get, &cbData_1);
	if(ret1!=ERROR_SUCCESS)
	{
		//	::MessageBox("错误: 无法查询有关注册表信息!");
		return;
	}
	//查询有关的数据 (公司名 company_Get)
	LPBYTE company_Get=new BYTE [80];
	DWORD type_2=REG_SZ; DWORD cbData_2=80;
	long ret2=::RegQueryValueEx(hKEY, "RegisteredOrganization", NULL,&type_2,company_Get, &cbData_2);
	if(ret2!=ERROR_SUCCESS)
	{
		//	::MessageBox("错误: 无法查询有关注册表信息!");
		return;
	}
	//将 owner_Get 和 company_Get 转换为 CString 字符串, 以便显示输出。
	CString str_owner=CString(owner_Get);
	CString str_company=CString(company_Get);
	delete[] owner_Get; delete[] company_Get;
	//程序结束前要关闭已经打开的 hKEY。
	::RegCloseKey(hKEY);
}

vc下ado操作数据库,把_variant_t转换为CString。MFC下测试可用。摘自网络

//数据类型转换函数
CString VariantToString(VARIANT var)
{
	CString strValue;
	_variant_t var_t;
	_bstr_t bstr_t;
	time_t cur_time;
	CTime time_value;
	COleCurrency var_currency;
	switch(var.vt)
	{
	case VT_EMPTY:
	case VT_NULL:strValue=_T("");break;
	case VT_UI1:strValue.Format("%d",var.bVal);break;
	case VT_I2:strValue.Format("%d",var.iVal);break;
	case VT_I4:strValue.Format("%d",var.lVal);break;
	case VT_R4:strValue.Format("%f",var.fltVal);break;
	case VT_R8:strValue.Format("%f",var.dblVal);break;
	case VT_CY:
		var_currency=var;
		strValue=var_currency.Format(0);break;
	case VT_BSTR:
		var_t =var;
		bstr_t=var_t;
		strValue.Format("%s",(const char *)bstr_t);break;
	case VT_DATE:
		cur_time=var.date;
		time_value=cur_time;
		strValue.Format("%A,%B,%d,%Y");break;
	case VT_BOOL:strValue.Format("%d",var.boolVal);break;
	default:strValue=_T("");break;
	}
	return strValue;
}



检查进程是否存在XXX程序.  MFC下测试可用

#include <TlHelp32.h>
//szExeFile 要检查的程序名
bool CRunsearchDlg::JudgeRunning(const char * szExeFile)
{
	//枚举当前系统的所有进程
	HANDLE TLProcess = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	PROCESSENTRY32 stEntry;
	stEntry.dwSize = sizeof(PROCESSENTRY32);
   	BOOL bIsRunning=FALSE;
	
	if(::Process32First(TLProcess, &stEntry))
	{
		do
		{
			if(0 == stricmp(stEntry.szExeFile, szExeFile))
			{
				HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 
					FALSE, stEntry.th32ProcessID);
				//Skype进程已经启动
				if(hProcess)
				{
					bIsRunning = TRUE;
				}
			}
		}
		while(::Process32Next(TLProcess, &stEntry));
	}
	return bIsRunning;
}


程序只能运行一个

// 只运行一个实例
	HANDLE hMe = CreateMutex(NULL,FALSE,"MAILSERVERINSTALLER"); //最后一个参数自定义名字,用来识别是否有相同名字的资源
	if(hMe)
	{
		if(ERROR_ALREADY_EXISTS==GetLastError())
		{
			CloseHandle(hMe);
			return 0;
		}
	}
//退出程序前释放资源
CloseHandle(hMe);





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值