这段时间总是在网上寻找一些资源,很郁闷的就是必须注册了才能下载,于是乎,产生了大量的账号密码要记忆。之前存放在一个文本文件中,条目比较多就难找了,于是自己决定写一个小工具来记录这些账号。
一,数据存储
秉着小巧的原则,我选择使用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;
}
四,下阶段
这种做法只是初步实现了记录功能。下阶段,我将加入软件打开密码,以及数据加密的功能,更好的去保障我们的账号安全
五,附件
全部代码以及资源文件