📄 bindfiledlg.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 + -