vc开发常用的自定义函数,持续更新。。。
2014-05-16 00:12
316 查看
编码转换函数
vc下用的编码转换函数。我是在mfc下写的,不需要另外包括头文件。ANSI和Unicode间转换,UTF8和Unicode间的转换,如果想ANSI跟UTF8转就得先转成Unicode。经过我多次修正。我现在只要需要转换编码的就直接copy就程序就行了。MFC下测试可用
如果用CString的Find函数寻找关键字时,如果buff里面有中文或者vc不能识别的编码方式,有可能会跳过你要找的关键字,所以说不是什么时候都能用Find,我针对上述问题写了个简单的CString的查询函数,直接复制到代码里面就能用。MFC下测试可用
注册表操作.MFC下测试可用
vc下ado操作数据库,把_variant_t转换为CString。MFC下测试可用。摘自网络
检查进程是否存在XXX程序. MFC下测试可用
程序只能运行一个
待续。。。
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; 4000 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);
待续。。。
相关文章推荐
- VC开发笔记(持续更新)
- iOS开发常用代码【持续更新中】
- [xcode]_[开发工具]_[常用高效工具总结][持续更新]
- iOS开发常用小技巧记录(持续更新)
- IOS开发--常用工具类收集整理(Objective-C)(持续更新)
- iOS开发常用的控件属性和注意事项(持续更新)
- IOS开发常用GitHub开源项目(持续更新...)
- [xcode]_[开发工具]_[常用高效工具总结][持续更新]
- Android中常用开发工具类—持续更新...
- 软件开发中常用的linux命令,持续更新~~~~~~
- 嵌入式软件开发常用的软件包(持续更新中)
- 项目开发过程中一些常用的工具[持续更新中]
- 常用开发工具快捷键--CodeBlocks【持续更新中】
- 音频开发之常用名词解释(持续更新)
- 开发中常用代码片段汇总(持续更新)
- 常用开发工具快捷键-Eclipse【持续更新中】
- Android开发中常用的库总结(持续更新)
- 关于组件化开发中常用到的svn,cocoapods代码管理工具错误解决办法(持续更新)
- iOS开发中对于一些常用的相对路径(持续更新)
- Android之开发常用小功能(持续更新中。。。)