//========================================================================
//TITLE:
// 程序自保存任意类型资源文件
//AUTHOR:
// norains
//DATE:
// Monday 08-December-2008
//Environment:
// WINCE 5.0 + ARM4VI BSP
//========================================================================
首先说一下,这标题听起来自己都觉得拗口,但限于本人文采所限,实在想不出更好的篇目名,所以还是一如既往,将就吧。
我们都知道,windows程序都能包含一些文件,比如ICO图标啊,对话框资源啊等等。除这些IDE自定义的类型以外,其实我们可以任意增加任意类型的文件;更绝的是,我们还能将这些任意类型的文件从程序中保存出来。想象一下,我们将某个exe文件保存到母程序中,当某一条件满足时,母程序将该子exe保存出来,然后再调用该子exe程序,那么剩下的事情就...
好了,废话少说,我们先来看看如果保存资源文件。
WriteResource是我写的保存资源文件的函数,函数体如下:
- BOOL WriteResource(LPCTSTR pszFileName, HINSTANCE hInstance, LPCTSTR lpResourceName, LPCTSTR lpResourceType)
- {
- BOOL bRes = FALSE;
- HRSRC hRSRC = FindResource(hInstance, lpResourceName, lpResourceType);
- DWORD dwError = GetLastError();
- if( hRSRC )
- {
- DWORD nNumberOfBytesToWrite = SizeofResource(hInstance, hRSRC);
- if( nNumberOfBytesToWrite )
- {
- HGLOBAL hRes = LoadResource(hInstance, hRSRC);
- if( hRes )
- {
- PBYTE pRes = reinterpret_cast<PBYTE>(LockResource(hRes));
- if( pRes )
- {
- HANDLE hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
- DWORD dwBytesWritten;
- bRes = WriteFile(hFile, pRes, nNumberOfBytesToWrite, &dwBytesWritten, NULL);
- CloseHandle(hFile);
- }
- // FreeResource(hRes);
- }
- }
- }
- return bRes;
- }
在这里先简单地说一下该函数的形参:
pszFileName: 资源文件保存到外部的文件名
hInstance:程序的实例,该参数可以直接从WinMain中得到。
lpResourceName:欲要保存的资源文件名,其实在具体使用中我们还需要用到MAKEINTRESOURCE宏。
lpResourceType:资源的类型
至于函数中各函数的意义,在MSDN和网上有大把资料,在这就不多说了。
假设我们程序中将qq当成个资源包含进来,现在想程序运行时解压该程序然后再运行,则代码可以这么参考:
- int WINAPI WinMain( HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPTSTR lpCmdLine,
- int nCmdShow)
- {
- // TODO: Place code here.
- const std::wstring strFile = TEXT("//QQ.exe");
- WriteResource(strFile.c_str(),hInstance,MAKEINTRESOURCE(IDR_MYTYPE1),TEXT("MyType"));
- PROCESS_INFORMATION prcInfo;
- CreateProcess(strFile.c_str(),NULL,NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&prcInfo);
- return 0;
- }
这个例子我已经上传到CSDN的下载栏目中,如果有需要可以直接下载。(http://download.csdn.net/source/850587)
在这里还需要说明一点容易让人忽略的,就是WriteResource函数的lpResourceType这个形参。其实取什么值和资源有关,甚至是导入时的操作有关。之所以在例子中给予该形参的类型为TEXT("MyType"),是因为我在导入资源时所给予的定义,如图所示: