比如想在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(第二版)