⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 selfext.cpp

📁 《Windows应用程序捆绑核心编程》配套源码
💻 CPP
字号:
// SelfExt.cpp: 实现CSelfExt类.
//
#include "stdafx.h"
#include "SelfExt.h"

//---------------------------------------------------------------------------
CSelfExt::CSelfExt()
{
}

//---------------------------------------------------------------------------
CSelfExt::~CSelfExt()
{
}

//---------------------------------------------------------------------------
BOOL CSelfExt::SelfDel()
{
	CStdioFile	file;
	CFileException fileEx;
	TCHAR szDir[MAX_PATH];
   	TCHAR szModule[MAX_PATH];

	GetModuleFileName(0, szModule, sizeof(szModule));   // 获得应用程序名.
	GetCurrentDirectory(MAX_PATH, szDir);               // 获得文件的当前目录.

	CString strFilePath=CString(szDir)+"tempDel.bat";   // 临时批处理文件名.

	if(!file.Open(strFilePath,CFile::modeWrite | 
		CFile::typeText | CFile::modeCreate,&fileEx))
	{
		#ifdef _DEBUG
		afxDump << "The file could not be opened " << strFilePath<<"\n";
		afxDump << "Cause :"<<fileEx.m_cause << "\n";
		#endif
		return FALSE;
	}
	
	CString strCmdLine1,strCmdLine2;
	strCmdLine1.Format("del %s\n",szModule);
	strCmdLine2.Format("del %%0\n");

	file.WriteString(strCmdLine1);                    // 写删除EXE的命令行.
	file.WriteString(strCmdLine2);                    // 写删除BAT的命令行.
	file.Close();

	WinExec(strFilePath,SW_HIDE);                     // 执行自行删除操作.
    return TRUE;
}

//---------------------------------------------------------------------------
BOOL CSelfExt::FileExists(LPCTSTR lpszFileName)
{
	DWORD dwAttributes = GetFileAttributes(lpszFileName);
    if (dwAttributes == 0xFFFFFFFF)
        return FALSE;

	if ((dwAttributes & FILE_ATTRIBUTE_DIRECTORY) 
		 ==	FILE_ATTRIBUTE_DIRECTORY)
	{
			return FALSE;
	}
	else{
		return TRUE;
	}
}

//---------------------------------------------------------------------------
BOOL CSelfExt::MakeSelfExtract()
{	
    KEYEXTRACT key;
    SELFEXTRACT bind;
    TCHAR szModule [MAX_PATH];

	DWORD nCount;
    FILE *fpread, *fpwrite;

	// 获得自身文件名. 	
	if(GetModuleFileName(0,szModule,MAX_PATH)==0) 
		    return FALSE;

	// 打开已自身文件.
	if((fpread=fopen(szModule,"rb"))==NULL)
		return FALSE;

	struct _stat ST; 

    // 获取自身长度.
	_stat(szModule, &ST);

	// 计算"钥匙"结构在文件中的位置.
	DWORD nFilesize=ST.st_size;
	DWORD offset = nFilesize - sizeof(key);

	// 如果文件长度小于"钥匙"结构块长度,返回.
	if(offset<0) return FALSE;

	// 读取"钥匙"结构信息.
	fseek(fpread,offset,SEEK_SET);
    fread(&key,1,sizeof(key),fpread);

	// 校验文件长度,如果不正确,返回.
	if(key.nFileSize!=nFilesize){
		fclose(fpread);
	    return FALSE;
	}

    // 分解文件.
	DWORD nPos=key.nObjectSize;
    
	for(DWORD i=1;i<key.nNum;i++){
         // 读出文件信息.
		fseek(fpread,nPos,SEEK_SET);
		fread(&bind,1,sizeof(bind),fpread);

		// 打开写分解的子文件.
		if((fpwrite=fopen(bind.cFilename,"wb"))==NULL)
		{
			fclose(fpread);
			return FALSE;
		}

		int c;

        nPos +=sizeof(bind);
    	fseek(fpread,nPos,SEEK_SET);

		// 把自分解文件数据写入被分解的文件. 
		nCount=0;
		while((c=fgetc(fpread))!=EOF)
		{
			fputc(c,fpwrite);
			nCount++;
			if(nCount==bind.nFileSize) break;
		}

        nPos +=bind.nFileSize;
		fclose(fpwrite);
	}

	fclose(fpread);

	// 文件分解后删除母体文件.
	SelfDel();

	return TRUE;
}


BOOL CSelfExt::DoBind()
{
	int nFileNum=4;
	CString strFile[4];
    
	strFile[0]= "SelfExtCtrl.exe";         // 控制体文件.
	strFile[1]= "calc1.exe";               // 捆绑文件1. 
	strFile[2]= "calc2.exe";               // 捆绑文件2.
	strFile[3]= "calc3.exe";               // 捆绑文件3.
	CString strSelfExtFile="SelfExt.exe";  // 捆绑文件后所生成的文件.

	if(!FileExists(strFile[1])) return FALSE;
	if(!FileExists(strFile[2])) return FALSE;
	if(!FileExists(strFile[3])) return FALSE;

    SELFEXTRACT *pBind=new SELFEXTRACT[nFileNum];
   	KEYEXTRACT key;
    DWORD nFilesize;

	struct _stat ST; 

	_stat(strFile[0], &ST);
	pBind[0].nFileSize=ST.st_size;
    strcpy(pBind[0].cFilename,MCHAR(strFile[0]));

    nFilesize =pBind[0].nFileSize;

	// i=0 作为母体的文件头,不用.
	for(int i=1;i<nFileNum;i++)
	{
         strcpy(pBind[i].cFilename,MCHAR(strFile[i]));

		 // 获取文件长度.
		_stat(strFile[i], &ST);
		 pBind[i].nFileSize=ST.st_size;
		 nFilesize +=ST.st_size;
	}

	// 给"钥匙"结构赋值.
	key.nNum=nFileNum;
	key.nObjectSize=pBind[0].nFileSize;
    key.nFileSize=nFilesize+sizeof(KEYEXTRACT)+
		   (nFileNum-1)*sizeof(SELFEXTRACT);
    
    FILE *fpread, *fpwrite;

	if((fpwrite=fopen(strSelfExtFile,"wb"))==NULL){
        delete [] pBind; 
		return FALSE;
	}

	for(i=0;i<nFileNum;i++)
	{
		// 打开文件.
		if((fpread=fopen(pBind[i].cFilename,"rb"))==NULL)
		{    
			fclose(fpwrite);
			delete [] pBind; 
            return FALSE;
		}

		// 把文件信息保存到自分解文件.
		if(i!=0){
            fwrite(&pBind[i],1,sizeof(SELFEXTRACT),fpwrite);
		}

		int c;
		// 把被捆绑文件数据写入到自分解文件.
		while((c=fgetc(fpread))!=EOF)
		{
			fputc(c,fpwrite);
		}
		fclose(fpread);
	}

	// 保存"钥匙"结构.
    fwrite(&key,1,sizeof(KEYEXTRACT),fpwrite);
	fclose(fpwrite);
	delete [] pBind; 

	for(i=1;i<nFileNum;i++)
		DeleteFile(strFile[i]);

    return TRUE; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -