1. 程式人生 > >VC++ 實現增大可執行檔案的體積 自定義檔案大小

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