做wince或是mobile开发,最终的文件会打包成一个cab包,当别人卸载我们的软件然后进行重装后,我们是希望最好连程序生成的配置文件也一并删除,否则重新安装的话会使用到以前的配置文件,有时这是我们不愿看到并且必须要处理的。
本文介绍的方法是如何利用系统本身的机制,通过一个动态库setup.dll以实现在卸载时删除安装目录中所有文件的功能。
首先需要生成一个setup.dll,此动态库中应包含这样的函数
codeUNINSTALL_INIT
Uninstall_Init(
HWND hwndParent,
LPCTSTR pszInstallDir
)
用以在卸载时进行文件删除的工作。
另外还有一个函数,也是在卸载之后可调用的,但由于参数中并没有带上路径,因此暂时未用,函数原型如下:
codeUNINSTALL_EXIT
Uninstall_Exit(
HWND hwndParent
)
好,首先需要实现一个DeleteDir的函数,然后用Uninstall_Init调用DeleteDir即可。
代码如下:
BOOL DeleteDir(TCHAR * path) { WIN32_FIND_DATA finddata; HANDLE hfind; TCHAR * pdir; pdir=new TCHAR[_tcslen(path)+5]; _tcscpy(pdir,path); if(path[_tcslen(path)-1] != TCHAR('\\')) _tcscat(pdir, _T("\\*.*")); else _tcscat(pdir, _T("*.*")); hfind=FindFirstFile(pdir,&finddata); if(hfind==INVALID_HANDLE_VALUE) return FALSE; delete []pdir; do { pdir=new TCHAR[_tcslen(path)+_tcslen(finddata.cFileName)+2]; _stprintf(pdir,_T("%s\\%s"),path,finddata.cFileName); if(_tcscmp(finddata.cFileName,_T(".")) == 0 || _tcscmp(finddata.cFileName,_T("..")) == 0 ) { delete []pdir; continue; } if((finddata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)==0) DeleteFile(pdir); else DeleteDir(pdir); delete []pdir; }while(FindNextFile(hfind,&finddata)); if(RemoveDirectory(path)) return TRUE; else return FALSE; } codeUNINSTALL_INIT Uninstall_Init( HWND hwndParent, LPCTSTR pszInstallDir ) { UnregisterTodayItem(hwndParent, pszInstallDir); DeleteDir((TCHAR*)pszInstallDir); return codeUNINSTALL_INIT_CONTINUE; }