VC++ 實現增大可執行檔案的體積 自定義檔案大小
做免殺的同學可能都會吧,增大檔案體積防止雲上傳是個不錯的方法
功能介面:
選擇檔案,是對話方塊支援檔案拖放(詳情見:http://blog.csdn.net/eldn__/article/details/8394060)
為對話方塊新增成員變數:CString m_filepath 用於儲存使用者選擇的檔案路徑
Slider Control 控制元件 關聯變數: 控制元件變數 m_slider (用於操縱控制元件) UINT m_size (用於方便獲取控制元件的當前值)
編輯框控制元件:ID IDC_EDIT_FILESIZE 關聯變數:UINT m_num(方便設定控制元件值)
控制元件屬性相關設定:
對話方塊:Accept Files: True
Slider 控制元件:
Enable Selection Rang :True
Point :Top/Left
Tick Marks:True
Auto Ticks:True
另外如果不希望對話方塊可以被調節大小,可以設定對話方塊的Border : Dialg Frame
功能函式實現:
一,兩種選擇檔案的方式(彈出選擇對話方塊, 拖放)
(詳情見:http://blog.csdn.net/eldn__/article/details/8394060)
二,根據Slider位置,增加檔案的大小
首先在OnInitDialog()中初始化Slider的相關屬性:
// TODO: 在此新增額外的初始化程式碼
m_slider.SetRange(0,100);//設定滑塊的取值範圍
m_slider.SetTicFreq(10);//設定滑塊每格的大小
m_slider.SetPos(0);//設定滑塊的初始位置
SetDlgItemText(IDC_EDIT_FILESIZE,"0");//設定編輯框的預設值
選擇檔案按鈕功能函式:
void CAddFileSizeDlg::OnBnClickedBtnSelectfile() { // TODO: 在此新增控制元件通知處理程式程式碼 CFileDialog fileDlg(true); fileDlg.m_ofn.lpstrTitle = "選擇你要增大的檔案"; fileDlg.m_ofn.lpstrFilter = "Executeable File(*.exe)\0*.exe\0\0"; if(IDOK==fileDlg.DoModal()) { m_filepath = fileDlg.GetPathName(); SetDlgItemText(IDC_EDIT_FILEPATH,m_filepath); } }
增大檔案函式實現:
為Slider控制元件新增響應事件NM_RELEASEDCAPTURE
在事件函式中獲取控制元件值:
void CAddFileSizeDlg::OnNMReleasedcaptureSlider1(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此新增控制元件通知處理程式程式碼
UpdateData(true);
m_size = m_sliderNum;
UpdateData(false);
*pResult = 0;
}
單擊增加按鈕實現增大檔案大小:
void CAddFileSizeDlg::OnBnClickedBtnDo()
{
// TODO: 在此新增控制元件通知處理程式程式碼
typedef HANDLE
(WINAPI
*CreateFileAT)(
__in LPCSTR lpFileName,
__in DWORD dwDesiredAccess,
__in DWORD dwShareMode,
__in_opt LPSECURITY_ATTRIBUTES lpSecurityAttributes,
__in DWORD dwCreationDisposition,
__in DWORD dwFlagsAndAttributes,
__in_opt HANDLE hTemplateFile
);
CreateFileAT pCreateFileA=(CreateFileAT)GetProcAddress(LoadLibrary("KERNEL32.dll"),"CreateFileA");
typedef DWORD
(WINAPI
*SetFilePointerT)(
__in HANDLE hFile,
__in LONG lDistanceToMove,
__in_opt PLONG lpDistanceToMoveHigh,
__in DWORD dwMoveMethod
);
SetFilePointerT pSetFilePointer=(SetFilePointerT)GetProcAddress(LoadLibrary("KERNEL32.dll"),"SetFilePointer");
HANDLE hFile1;
DWORD dwBytes1;
hFile1 = pCreateFileA(m_filepath, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
pSetFilePointer(hFile1, 0, NULL,FILE_END);
int ii = 0;
int DesSize = m_slider.GetPos();
char *szStrAdd;
szStrAdd=new char[1024*1024];
memset(szStrAdd,'.',1024*1024);
while(ii < DesSize)
{
typedef int
(WINAPI
*lstrlenAT)(
__in LPCSTR lpString
);
lstrlenAT plstrlenA=(lstrlenAT)GetProcAddress(LoadLibrary("KERNEL32.dll"),"lstrlenA");
WriteFile(hFile1, szStrAdd, plstrlenA(szStrAdd), &dwBytes1, NULL);
ii++;
}
MessageBox("增加檔案體積成功");
CloseHandle(hFile1);
}
另外i補充個我總喜歡犯糊塗的地方:
updateData(true) //用視窗中的資料去初始化控制元件關聯的變數
UpdateData(false); //更新資料到視窗
原始碼:
http://download.csdn.net/detail/eldn__/4920248