您的位置:首页 > 其它

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

2014-05-16 00:12 316 查看
编码转换函数

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 windows 数据