程序自保存任意类型资源文件

//========================================================================
//TITLE:
// 程序自保存任意类型资源文件
//AUTHOR:
// norains
//DATE:
// Monday 08-December-2008
//Environment:
// WINCE 5.0 + ARM4VI BSP
//========================================================================
首先说一下,这标题听起来自己都觉得拗口,但限于本人文采所限,实在想不出更好的篇目名,所以还是一如既往,将就吧。

我们都知道,windows程序都能包含一些文件,比如ICO图标啊,对话框资源啊等等。除这些IDE自定义的类型以外,其实我们可以任意增加任意类型的文件;更绝的是,我们还能将这些任意类型的文件从程序中保存出来。想象一下,我们将某个exe文件保存到母程序中,当某一条件满足时,母程序将该子exe保存出来,然后再调用该子exe程序,那么剩下的事情就...

好了,废话少说,我们先来看看如果保存资源文件。

WriteResource是我写的保存资源文件的函数,函数体如下:

  1. BOOLWriteResource(LPCTSTRpszFileName,HINSTANCEhInstance,LPCTSTRlpResourceName,LPCTSTRlpResourceType)
  2. {
  3. BOOLbRes=FALSE;
  4. HRSRChRSRC=FindResource(hInstance,lpResourceName,lpResourceType);
  5. DWORDdwError=GetLastError();
  6. if(hRSRC)
  7. {
  8. DWORDnNumberOfBytesToWrite=SizeofResource(hInstance,hRSRC);
  9. if(nNumberOfBytesToWrite)
  10. {
  11. HGLOBALhRes=LoadResource(hInstance,hRSRC);
  12. if(hRes)
  13. {
  14. PBYTEpRes=reinterpret_cast<PBYTE>(LockResource(hRes));
  15. if(pRes)
  16. {
  17. HANDLEhFile=CreateFile(pszFileName,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
  18. DWORDdwBytesWritten;
  19. bRes=WriteFile(hFile,pRes,nNumberOfBytesToWrite,&dwBytesWritten,NULL);
  20. CloseHandle(hFile);
  21. }
  22. //FreeResource(hRes);
  23. }
  24. }
  25. }
  26. returnbRes;
  27. }

在这里先简单地说一下该函数的形参:
pszFileName: 资源文件保存到外部的文件名
hInstance:程序的实例,该参数可以直接从WinMain中得到。
lpResourceName:欲要保存的资源文件名,其实在具体使用中我们还需要用到MAKEINTRESOURCE宏。
lpResourceType:资源的类型

至于函数中各函数的意义,在MSDN和网上有大把资料,在这就不多说了。

假设我们程序中将qq当成个资源包含进来,现在想程序运行时解压该程序然后再运行,则代码可以这么参考:

  1. intWINAPIWinMain(HINSTANCEhInstance,
  2. HINSTANCEhPrevInstance,
  3. LPTSTRlpCmdLine,
  4. intnCmdShow)
  5. {
  6. //TODO:Placecodehere.
  7. conststd::wstringstrFile=TEXT("//QQ.exe");
  8. WriteResource(strFile.c_str(),hInstance,MAKEINTRESOURCE(IDR_MYTYPE1),TEXT("MyType"));
  9. PROCESS_INFORMATIONprcInfo;
  10. CreateProcess(strFile.c_str(),NULL,NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&prcInfo);
  11. return0;
  12. }

这个例子我已经上传到优快云的下载栏目中,如果有需要可以直接下载。(http://download.youkuaiyun.com/source/850587

在这里还需要说明一点容易让人忽略的,就是WriteResource函数的lpResourceType这个形参。其实取什么值和资源有关,甚至是导入时的操作有关。之所以在例子中给予该形参的类型为TEXT("MyType"),是因为我在导入资源时所给予的定义,如图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值