我的密码箱--01

这段时间总是在网上寻找一些资源,很郁闷的就是必须注册了才能下载,于是乎,产生了大量的账号密码要记忆。之前存放在一个文本文件中,条目比较多就难找了,于是自己决定写一个小工具来记录这些账号。

一,数据存储

秉着小巧的原则,我选择使用sqlite来存储数据。基本无须配置就能使用强大的数据库。

建立数据表 CREATE TABLE xt_pwdbox(id INTEGER PRIMARY KEY,entry TEXT NOT NULL,account TEXT NOT NULL,passwd TEXT NOT NULL,lab TEXT NOT NULL)

数据操作

int sqlite_Insert(sqlite3 * conn,const char* entry,const char*account,const char*pwd,const char*lab,char * szErrMsg)
{
	char sql[128]="";

	sprintf(sql, "INSERT INTO xt_pwdbox(entry, account,passwd,lab) VALUES('%s', '%s', '%s', '%s')",entry,account,pwd,lab );
	return sqlite3_exec(conn,sql,0, 0, &szErrMsg);
}
int sqlite_getAll(sqlite3 * conn,char** &pszResult,int * pnRow,int *pnCol,char * szErrMsg)
{
	//select id,entry,account, passwd,lab from xt_pwdbox
	char *sql = "select id,entry,account, passwd,lab from xt_pwdbox";
	return  sqlite3_get_table(conn, sql, &pszResult, pnRow, pnCol, &szErrMsg);
}

int sqlite_update(sqlite3 * conn,int oldid,char* entry,char*account,char*pwd,char*lab,char * szErrMsg)
{
	char sql[512]="";
	sprintf(sql,"update xt_pwdbox set entry = '%s',account= '%s',passwd= '%s',lab= '%s' where id = %d",entry,account,pwd,lab,oldid);
	return sqlite3_exec(conn,sql,0,0,&szErrMsg);

}
int sqlite_delete(sqlite3 * conn,int oldid,char * szErrMsg)
{
	char sql[512]="";
	sprintf(sql,"delete from xt_pwdbox where id = %d",oldid);
	return sqlite3_exec(conn,sql,0,0,&szErrMsg);
}

二,用户界面

比较熟悉Windows编程,于是使用Win32 API来制作界面

   hListCtrl = CreateWindow(TEXT("SysListView32"), NULL,
	   LVS_REPORT|WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL,0, 0, 200, 
	   200,hWnd, NULL, hInst, NULL);
   ListView_SetExtendedListViewStyle(hListCtrl,LVS_EX_FULLROWSELECT);   //设置选择正行,否则只能选择第一列的数据
   init(hListCtrl);                                                     //初始化这个List

   HICON hIcon = LoadIcon((HINSTANCE) GetWindowLong(hWnd, GWL_HINSTANCE) ,MAKEINTRESOURCE(IDI_ICON1)); //设置图标
   SendMessage(hWnd, WM_SETICON, TRUE, (LPARAM)hIcon);
   SendMessage(hWnd, WM_SETICON, FALSE, (LPARAM)hIcon);

ListVIew的插入操作代码

void insertsubitem(HWND hwnd,TCHAR str1[],int nRow,int nCol)
{
	TCHAR   szString[256];
	wsprintf(szString,str1,0);
	LVITEM lvItem;
	lvItem.mask = LVIF_TEXT;
	lvItem.iItem=nRow;
	lvItem.iSubItem=nCol;
	lvItem.pszText=szString;

	ListView_InsertItem(hwnd,&lvItem);

}
void InsertListColumn(HWND HList,TCHAR text[])
{

	LVCOLUMN LVColInfo ;
	LVColInfo.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT;
	LVColInfo.fmt = LVCFMT_CENTER;
	LVColInfo.cx = 80;
	LVColInfo.pszText = text ;
	LVColInfo.cchTextMax = 300;
	ListView_InsertColumn(HList, iCol, &LVColInfo);
	iCol ++ ;
}
void init(HWND HList)
{	
	InsertListColumn(HList,TEXT("id"));
	InsertListColumn(HList,TEXT("入口"));
	InsertListColumn(HList,TEXT("账号"));
	InsertListColumn(HList,TEXT("密码"));
	InsertListColumn(HList,TEXT("标签"));

	ListView_SetColumnWidth(HList,0,80);
	ListView_SetColumnWidth(HList,1,102);
	ListView_SetColumnWidth(HList,2,115);
	ListView_SetColumnWidth(HList,3,115);
	ListView_SetColumnWidth(HList,4,115);
}

插入数据为

void InsetToList(HWND HList,TCHAR* tmpid,TCHAR*tmpPort,TCHAR*tmpAccount,TCHAR* tmpPasswd,TCHAR* tmpLab,int n)
{
	insertsubitem(HList,tmpid,n,0);
	ListView_SetItemText(HList,n,1,tmpPort);
	ListView_SetItemText(HList,n,2,tmpAccount);
	ListView_SetItemText(HList,n,3,tmpPasswd);
	ListView_SetItemText(HList,n,4,tmpLab);
}

实现删除功能:

BOOL CALLBACK DeleteItem( HWND hwndDlg )
{
	TCHAR tp[128];
	char tid[256];
	int Cur;
	Cur = SendMessage(hListCtrl, LVM_GETNEXTITEM, -1, LVNI_SELECTED);
	if(Cur == -1) //未选择
	{
		return TRUE ;
	}
	LV_ITEM lvi;
	lvi.mask = LVIF_TEXT;
	lvi.cchTextMax = 20;
	lvi.iItem = Cur;
	lvi.iSubItem = 0;
	lvi.pszText = tp;
	SendMessage(hListCtrl, LVM_GETITEM, 0, (long)&lvi);
	UnicodeToMB(tid,tp);
	sqlite_delete(conn,atoi(tid),szErrMsg);
	SendMessage(hListCtrl, LVM_DELETEITEM, Cur, 0);
	return true;
}


三,编码转换

由于Sqlite使用的是UTF-8编码,而在Windows下使用的是Unicode,于是写了两个字符编码转换函数

bool Utf82Unicode(char * utf8, TCHAR* unicode)  
{  
	int widesize = ::MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);  
	if (widesize == ERROR_NO_UNICODE_TRANSLATION)  
	{  
		throw std::exception("Invalid UTF-8 sequence.");  
	}  
	if (widesize == 0)  
	{  
		throw std::exception("Error in conversion.");  
	}  

	int convresult = ::MultiByteToWideChar(CP_UTF8, 0, utf8, -1, unicode, widesize);  

	if (convresult != widesize)  
	{  
		throw std::exception("La falla!");  
	}  

	return true;  
} 
bool Unicode2Utf8(TCHAR* unicode,char * utf8)  
{  
	int utf8size = ::WideCharToMultiByte(CP_UTF8, 0, unicode, -1, NULL, 0, NULL, NULL);  
	if (utf8size == 0)  
	{  
		throw std::exception("Error in conversion.");  
	}  

	int convresult = ::WideCharToMultiByte(CP_UTF8, 0,unicode, -1, utf8, utf8size, NULL, NULL);  

	if (convresult != utf8size)  
	{  
		throw std::exception("La falla!");  
	}  
	return true;
}  

四,下阶段

这种做法只是初步实现了记录功能。下阶段,我将加入软件打开密码,以及数据加密的功能,更好的去保障我们的账号安全

五,附件

全部代码以及资源文件

http://download.csdn.net/detail/xutengaaa/6750625

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值