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

📄 bindfiledlg.cpp

📁 迷你星文件捆绑器源码
💻 CPP
字号:
// BindFileDlg.cpp : implementation file
//

#include "stdafx.h"
#include "BindFile.h"
#include "BindFileDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


CIcons *pIcons;

BOOL CALLBACK MyEnumProcedure( HANDLE  hModule, LPCTSTR  lpszType, LPTSTR  lpszName, LONG  lParam );

struct MODIFY_DATA {
     unsigned int finder; // 常量(定位自身)
     _off_t my_length;      //文件长度(自身)
} modify_data = {0x12345678, 0};

// CAboutDlg dialog used for App About


/////////////////////////////////////////////////////////////////////////////
// CBindFileDlg dialog

CBindFileDlg::CBindFileDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CBindFileDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CBindFileDlg)
	m_strFirstPath = _T("");
	m_strSecondPath = _T("");
	m_strFinalPath = _T("");
	m_IconPath = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CBindFileDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CBindFileDlg)
	DDX_Control(pDX, IDC_LINKMAIL, m_LinkMail);
	DDX_Control(pDX, IDC_BTNRIGHT, m_btnRight);
	DDX_Control(pDX, IDC_BTNLEFT, m_btnLeft);
	DDX_Control(pDX, IDC_ICONGROUP, m_IconGroup);
	DDX_Control(pDX, IDC_ICONPIC, m_IconPic);
	DDX_Control(pDX, IDC_ICONPATH, m_Edit3);
	DDX_Control(pDX, IDC_FINALPATH, m_Edit4);
	DDX_Control(pDX, IDC_SECONDPATH, m_Edit2);
	DDX_Control(pDX, IDC_FIRSTPATH, m_Edit1);
	DDX_Control(pDX, IDC_CANCEL, m_BtnCancel);
	DDX_Control(pDX, IDC_BTNICON, m_BtnIcon);
	DDX_Control(pDX, IDC_STATICTITLE, m_Title);
	DDX_Control(pDX, IDC_SECONDBROWSE, m_SecondBrowse);
	DDX_Control(pDX, IDC_FIRSTBROWSE, m_FirstBrowse);
	DDX_Control(pDX, IDC_FINALBROWSE, m_FinalBrowse);
	DDX_Control(pDX, IDC_BUTTON_BINDFILE, m_BindFile);
	DDX_Text(pDX, IDC_FIRSTPATH, m_strFirstPath);
	DDX_Text(pDX, IDC_SECONDPATH, m_strSecondPath);
	DDX_Text(pDX, IDC_FINALPATH, m_strFinalPath);
	DDX_Text(pDX, IDC_ICONPATH, m_IconPath);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CBindFileDlg, CDialog)
	//{{AFX_MSG_MAP(CBindFileDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_FIRSTBROWSE, OnFirstBrowse)
	ON_BN_CLICKED(IDC_SECONDBROWSE, OnSecondBrowse)
	ON_BN_CLICKED(IDC_FINALBROWSE, OnFinalBrowse)
	ON_BN_CLICKED(IDC_BUTTON_BINDFILE, OnButtonBindFile)
	ON_BN_CLICKED(IDC_BTNICON, OnBtnicon)
	ON_BN_CLICKED(IDC_CANCEL, OnCancel)
	ON_BN_CLICKED(IDC_ICONGROUP, OnIcongroup)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBindFileDlg message handlers

BOOL CBindFileDlg::OnInitDialog()
{
	
	CDialog::OnInitDialog();
	//初始置各文件名变量为空
	strFirstFilePath = "";
	strSecondFilePath = "";
	strFinalFilePath = "";
	//初始化变量
	prog1_length = 0;
	his_name = "";
	buf = NULL;
	//获取自身文件名
	GetCurrentDirectory(sizeof(my_name),my_name);
	if (strlen(my_name)==3)
        strcat(my_name,"bind.dat");
		else
        strcat(my_name,"\\bind.dat");
	//MessageBox(my_name);
	struct _stat ST; 
	_stat(my_name, &ST);
	//此外加入捆绑器程序的最终大小,来判断是绑定文件还是分解执行文件
	//if(ST.st_size > 100*1024) 
	//{
    //  Unbind_and_Run(); //分离文件并运行
	//  exit(0);    //直接退出程序,不显示捆绑程序画面
	//}
	
	m_btnLeft.SetIcon(IDI_LEFT);
	m_btnLeft.DrawTransparent(TRUE);
	m_btnLeft.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
	m_btnLeft.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(220,236,216));
    m_btnLeft.DrawBorder(FALSE);
	m_btnRight.SetIcon(IDI_RIGHT);
	m_btnRight.DrawTransparent(TRUE);
	m_btnRight.OffsetColor(CButtonST::BTNST_COLOR_BK_IN, 30);
	m_btnRight.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(220,236,216));
	m_btnRight.DrawBorder(FALSE);	
	m_LinkMail.SetURL(_T("mailto:Mr.Freeman@163.com?subject=想和你交个朋友!"));

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CBindFileDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
		CDialog::OnSysCommand(nID, lParam);
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CBindFileDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CBindFileDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

//绑定多个文件为一个合成文件
bool CBindFileDlg::Bind_Files()
{
     FILE* out;      //最终合成文件
     FILE* in;       //待绑定文件
     int bytesin;
     int totalbytes = 0;
     struct _stat ST;
     his_name = strFirstFilePath; //第一个绑定的文件名
     HRSRC hData;
	 HGLOBAL hDataRes;
     hData = FindResource(0, MAKEINTRESOURCE(IDR_HEADER1), "HEADER"); 
	 if (!hData)
	 {
		AfxMessageBox("Bind Header Resource not found!");
		return false;
	 }
	 hDataRes = LoadResource(0, hData);
	 if (!hDataRes)
	 {
		 AfxMessageBox("Load Header Resource failed!");
		 return false;
	 }
	 DWORD nDataLen = SizeofResource(0,hData);
	 
	 buf = (BYTE *)malloc(nDataLen);
	 if (!buf)
	 {
		 AfxMessageBox("Malloc Header Buffer failed!");
		 return false;
	 }
     memcpy(buf,hDataRes,nDataLen);
	 UpdateData(true);
	 if (!(_stat(m_IconPath, &ST) != 0 || ST.st_size == 0))
     	 ChangeIcon(m_IconPath);
     if (_stat(strFirstFilePath, &ST) != 0 || ST.st_size == 0)
     {
          free(buf);
          MessageBox("读取第一个文件时!","错误");
		  return false;
     }
     
     out = fopen(strFinalFilePath, "wb"); //创建最终合成文件
     if (out == NULL)
     {
          free(buf);
          MessageBox("创建合成文件时出错!","错误");
		  return false;
     }

     totalbytes += fwrite(buf, 1, nDataLen, out);
	 free(buf);

     totalbytes += fwrite(&ST.st_size, 1, sizeof(ST.st_size), out);  //写入第一个要绑定文件的长度到合成文件中
     in = fopen(strFirstFilePath, "rb");  //打开第一个要绑定的文件
     if (!in)
     {
          free(buf);
          MessageBox("打开第一个要绑定文件时出错!","错误");
		  return false;
     }
    
     buf = (BYTE *)malloc(ST.st_size);
     while (bytesin = fread(buf, 1, ST.st_size, in))
     {
          totalbytes += fwrite(buf, 1, bytesin, out);
     }
     fclose(in); //关闭第一个绑定文件句柄
     free(buf);
     _stat(strSecondFilePath, &ST);
     in = fopen(strSecondFilePath, "rb");   //打开第二个要绑定的文件
     buf = (BYTE *)malloc(ST.st_size);
     if (in == NULL)
     {
          free(buf);
          MessageBox("打开第二个要绑定文件时出错!","错误");
		  return false;
     }
     while (bytesin = fread(buf, 1, ST.st_size, in))
     {
          totalbytes += fwrite(buf, 1, bytesin, out);
     }

     fclose(in);  //关闭第二个绑定文件句柄
     fclose(out); //关闭最终合成文件句柄
     free(buf);   //释放缓冲区

	 return true;
}

//打开“关于”对话框


//选取第一个要绑定的文件
void CBindFileDlg::OnFirstBrowse() 
{
    CFileDialog fileDialog(TRUE,NULL,NULL,NULL,"*.exe(*.exe)|*.exe|(*.*)|*.*||");

	if (fileDialog.DoModal() == IDOK) 
	{
		strFirstFilePath = fileDialog.GetPathName(); //保存第一个绑定文件名
		m_strFirstPath = strFirstFilePath;

		UpdateData(FALSE);
	}			
}

//选取第二个要绑定的文件
void CBindFileDlg::OnSecondBrowse() 
{
	CFileDialog fileDialog(TRUE,NULL,NULL,NULL,"*.exe(*.exe)|*.exe|(*.*)|*.*||");

	if (fileDialog.DoModal() == IDOK) 
	{
		strSecondFilePath = fileDialog.GetPathName(); //保存第二个绑定文件名
		m_strSecondPath = strSecondFilePath;

		UpdateData(FALSE);
	}
	
}

//选择绑定后生成的合成文件名
void CBindFileDlg::OnFinalBrowse() 
{
    CFileDialog fileDialog( FALSE,"*.exe",NULL,NULL,"*.exe(*.exe)|*.exe||");
	if (fileDialog.DoModal() == IDOK) 
	{
		strFinalFilePath = fileDialog.GetPathName();   //保存第终合成的文件名		
        m_strFinalPath = strFinalFilePath;		

		UpdateData(FALSE);
	}		
}



//进行绑定文件操作
void CBindFileDlg::OnButtonBindFile() 
{
     if(strFirstFilePath=="" || strSecondFilePath=="" ||strFinalFilePath=="")
	 {
		 MessageBox("请先选择所需文件名!","提示",MB_ICONINFORMATION);
		 return;
	 }	

     if(Bind_Files())  //绑定文件
		 MessageBox("恭喜大虾! 合并成功完成!","提示",MB_ICONINFORMATION);
}



CString CBindFileDlg::GetFileName()
{
	
	return "";
}

void CBindFileDlg::OnCancel() 
{
    OnOK();	
}

void CBindFileDlg::OnBtnicon() 
{
//    LPTSTR lpIconID;
	HICON hIcon;
	CFileDialog fileDialog(TRUE,NULL,NULL,NULL,"766字节图标文件(*.ico)|*.ico|Win32可执行文件(*.exe,*.dll)|*.exe;*.dll||");
	if (fileDialog.DoModal() == IDOK) 
	{
		m_IconPath = fileDialog.GetPathName();
		szOpenFileExtName= fileDialog.GetFileExt ();
		szOpenFileExtName.MakeLower();
		UpdateData(FALSE);
	
	    //ChangeIcon(m_IconPath);	
		if(szOpenFileExtName =="ico") 
		{
			lpIR=pIcons->ReadIconFromICOFile (m_IconPath);		
			
			hIcon=ExtractIcon(AfxGetInstanceHandle(),m_IconPath,0);
            if(hIcon!=NULL)
			{
				CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONPIC);
				pStatic->SetIcon (hIcon);
			}
		}
	    else
		{
			HINSTANCE  hLibrary;

		   if( (hLibrary = LoadLibraryEx( m_IconPath, NULL, LOAD_LIBRARY_AS_DATAFILE )) == NULL )
		   {
			MessageBox( m_IconPath+ "文件载入错误,必须是WIN32的文件!", "错误", MB_OK );
			return;
		   }
		   EDII.szFileName =m_IconPath;
		   EDII.hInstance = hLibrary;
		   if(!EnumResourceNames(EDII.hInstance, RT_GROUP_ICON, (ENUMRESNAMEPROC )MyEnumProcedure, (LPARAM)GetSafeHwnd()) )
		   {
			MessageBox( "列举图标资源名时出错!", "错误", MB_OK );
			return;
		   }
		    hIcon=pIcons->GetIconFromInstance(EDII.hInstance,"Icon [128]");
	        CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONPIC);
	        pStatic->SetIcon (hIcon);
		}
	}
}

void CBindFileDlg::ChangeIcon(CString IconFile)
{
    FILE* ficon;
	ficon = fopen(IconFile, "rb");
	 if (ficon == NULL)
     {
		 //free(buf);
		 MessageBox("打开图标文件失败!");
		 fclose(ficon);
		 return;
     }
	 fseek(ficon,22,SEEK_SET);
	 if (fread(buf+3232, 1, 766-22, ficon) == 0)
     {
		 //free(buf);
         AfxMessageBox("读取图标文件出错!");
		 fclose(ficon);
		 return;
     }
	 fclose(ficon);
}


BOOL CALLBACK MyEnumProcedure( HANDLE  hModule, LPCTSTR  lpszType, LPTSTR  lpszName, LONG  lParam )	
{
    TCHAR	szBuffer[256];
    LONG    nIndex = LB_ERR;
    LPTSTR	lpID = NULL;

    // Name is from MAKEINTRESOURCE()
    if( HIWORD(lpszName) == 0 )
    {
        wsprintf( szBuffer, "Icon [%d]", (DWORD)lpszName );
        lpID = lpszName;
    }
    else
    {
        // Name is string
        lpID = strdup( lpszName );
        wsprintf( szBuffer, "Icon [%s]", lpID );
    }
    // Add it to the listbox
    nIndex = SendDlgItemMessage( (HWND)lParam, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM)(szBuffer) );
    // Set the item data to be the name of the resource so we can get it later
    SendDlgItemMessage( (HWND)lParam, IDC_LIST1, LB_SETITEMDATA, (WPARAM)nIndex, (LPARAM)lpID );

    return TRUE;
}

void CBindFileDlg::OnIcongroup() 
{
    CIconDlg dlgIcon;
	dlgIcon.DoModal();
	if (dlgIcon.hasSelected==true)
    {
		m_IconPath=dlgIcon.fname;
		UpdateData(false);
		lpIR=pIcons->ReadIconFromICOFile (m_IconPath);		
		HICON hIcon;
		hIcon=ExtractIcon(AfxGetInstanceHandle(),m_IconPath,0);
		CStatic* pStatic = (CStatic*) GetDlgItem(IDC_ICONPIC);
		pStatic->SetIcon (hIcon);
	}
   

	
	
}

⌨️ 快捷键说明

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