典型的uninstall(第二版)
比如想在QQ安装包里面添加文件的时候,以前我都是改msi,而ansifa则是使用QQ.exe包含所需文件,第一次运行时即可释放。我每次都改msi也确实改够了,还是做个一次性的了解吧,以后就方便了。
主要功能是从exe资源的zip文件中释放包括QQ.exe的所有资源,然后启动QQ.exe。临时文件会在重启后删除。
哦,因为QQ是UNICODE的,所以最好这个程序也要是UNICODE的。
源代码如下(修改了代码,支持zip文件中的中文了):
#include <windows.h> #include <shlobj.h> #include <tchar.h> #include "unzip.cpp" wchar_t title[]=L"QQ文件释放工具"; void ChuangJianJinCheng(wchar_t *szCmdLine) //创建进程 { STARTUPINFOW si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); PROCESS_INFORMATION pi; ZeroMemory( &pi, sizeof(pi) ); if(CreateProcessW(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)==0) { MessageBoxW(0, L"错误: 创建进程时失败!", title, MB_ICONSTOP); } } int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { int argc; wchar_t **argv; argv = CommandLineToArgvW(GetCommandLineW(), &argc); if (argc != 3) { //保护程序 if (wcsicmp(wcsrchr(argv[0],'\\')+1, L"QQ.exe") != 0) { MessageBoxW(0, L"警告: 此程序禁止分离运行!", title, MB_ICONSTOP); return 0; } wchar_t szPathOrig[1024], szPathTemp[1024]; wsprintfW(szPathOrig, L"%s", argv[0]); //复制执行文件到当前目录//临时文件夹 wcscpy(szPathTemp, L".");//GetTempPath(MAX_PATH, szPathTemp); GetTempFileNameW(szPathTemp, L"tmp", 0, szPathTemp); CopyFileW(szPathOrig, szPathTemp, FALSE); SetFileAttributesW(szPathTemp, FILE_ATTRIBUTE_HIDDEN); //运行临时文件 wchar_t szCmdLine[512]; HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE, GetCurrentProcessId()); wsprintfW(szCmdLine, L"%s %d \"%s\" ", szPathTemp, hProcessOrig, szPathOrig); ChuangJianJinCheng(szCmdLine); CloseHandle(hProcessOrig); } else { //删除原始文件 HANDLE hProcessOrig; swscanf(argv[1],L"%d",&hProcessOrig); WaitForSingleObject(hProcessOrig, INFINITE); CloseHandle(hProcessOrig); DeleteFileW(argv[2]); //解压zip中所有文件 HRSRC hrsrc = FindResourceW(hInstance, MAKEINTRESOURCEW(1), L"SHUAX"); if(hrsrc==0) { MessageBoxW(0, L"错误: 程序资源寻找失败!", title, MB_ICONSTOP); return 0; } HANDLE hglob = LoadResource(hInstance, hrsrc); void *zipbuf = LockResource(hglob); unsigned int ziplen = SizeofResource(hInstance, hrsrc); HZIP hz = OpenZip(zipbuf, ziplen, 0); //设置解压目录 SetUnzipBaseDir(hz,L"."); ZIPENTRY ze; GetZipItem(hz, -1, &ze); int numitems = ze.index; for (int zi = 0; zi < numitems; zi++) { ZIPENTRY ze; GetZipItem(hz, zi, &ze); UnzipItem(hz, zi, ze.name); } CloseZip(hz); //运行进程 ChuangJianJinCheng(argv[2]); //删除临时文件(重启后删除) SHChangeNotify(SHCNE_DELETE, SHCNF_PATH, argv[0], 0); MoveFileExW(argv[0], 0, MOVEFILE_DELAY_UNTIL_REBOOT); //刷新图标 SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST + SHCNF_FLUSH,NULL,NULL); SHChangeNotify(SHCNE_ALLEVENTS , SHCNF_FLUSH, 0, 0); } return 0; } |
资源文件res.rc内容
1 SHUAX DISCARDABLE “DATA\\DATA.zip”
生成的exe下载:
原创文章,转载请注明: 转载自耍下
本文链接地址: 典型的uninstall(第二版)
| 这篇文章由Mr. Shu于2010年07月26日 上午 8:14发表在C/C++。你可以订阅RSS 2.0。 也可以发表评论或引用到你的网站。 |

大约1月前
sp1呢?昨晚我可是QQ你了啊!等了一早上还是没。
大约1月前
在这里:
QQ2010 正式版 SP1 [去附带软件+去插件校验][2010.07.27]
http://u.115.com/file/f03bbffe83
要东西直接找我QQ呗