这节课我们学习开始加壳这个按钮功能的实现
首先添加个和文件名相关的成员变量。在classview中,双击CHUADlg函数,在类的定义中申明成员变量:
public:
CString m_FilePathNamePacked; //加壳后的文件名
双击开始加壳按钮,写入以下代码
void CHUADlg::OnButtonPacking()
{
HANDLE hFile; //文件句柄
HANDLE hMapping; //文件映射句柄
LPVOID lpHeadBase; //创建映射的头指针
DWORD dwFileSize; //文件大小
DWORD dwBufferRead; //实际读取字节
//打开文件
hFile=CreateFile(m_FilePathName,GENERIC_READ,FILE_SHARE_READ,NULL,
OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
//如果文件打开失败,就弹出对话框,并返回。
if (hFile==INVALID_HANDLE_VALUE)
{
MessageBox("打开文件失败!","错误提示",MB_OK);
return;
}
//获取文件大小
dwFileSize=GetFileSize(hFile,NULL);
//设定加壳后的文件名
m_FilePathNamePacked=m_FilePathName.Left(m_FilePathName.GetLength()-4)+"_packed.exe";
//创建文件映射。如果对文件映射不了解,请自行查阅相关资料。
hMapping=CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
//如果创建映射失败,弹出对话框,并关闭文件句柄,然后返回。
if (hMapping==NULL)
{
MessageBox("创建文件映射失败!","错误提示",MB_OK);
CloseHandle(hFile); //关闭创建的文件句柄
return;
}
//将文件映射对象映射到当前应用程序的地址空间中
lpHeadBase=MapViewOfFile(hMapping,FILE_MAP_READ,0,0,0);
if (lpHeadBase==NULL)
{
MessageBox("文件映射地址失败!","错误提示",MB_OK);
CloseHandle(hMapping); //关闭映射句柄
CloseHandle(hFile); //关闭文件句柄
return;
}
//创建加壳后的文件句柄
hFile=CreateFile(m_FilePathNamePacked,GENERIC_READ|GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile==INVALID_HANDLE_VALUE)
{
MessageBox("生成文件失败!","错误提示!",MB_OK);
}
//写入文件
if (!WriteFile(hFile,lpHeadBase,dwFileSize,&dwBufferRead,NULL))
{
MessageBox("写入文件失败!","错误提示!",MB_OK);
//卸载文件映射,关闭文件句柄
UnmapViewOfFile(lpHeadBase);
CloseHandle(hMapping);
CloseHandle(hFile);
return;
}
//卸载文件映射,关闭文件句柄
UnmapViewOfFile(lpHeadBase);
CloseHandle(hMapping);
CloseHandle(hFile);
//在编辑框中显示信息
m_RichEditProcInfo.ReplaceSel("文件加壳完成!\r\n");
MessageBox("创建文件成功!","成功提示",MB_OK);
}
针对于上次还要修改的地方:
打开对话框资源,修改RichEdit的属性,勾选“多行”和“自动垂直滚动”,去掉“自动水平滚动”。
在OnButtonOpenfile() 函数中,在代码
//替换编辑框最后的内容,实际上就是在最后添加内容。
m_RichEditProcInfo.ReplaceSel("文件路径:");
m_RichEditProcInfo.ReplaceSel(m_FilePathName);
的后面添加:
m_RichEditProcInfo.ReplaceSel("\r\n");