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

//========================================================================
//TITLE:
//    程序自保存任意类型资源文件
//AUTHOR:
//    norains
//DATE:
//    Monday 08-December-2008
//Environment:
//    WINCE 5.0 + ARM4VI BSP
//========================================================================
    首先说一下,这标题听起来自己都觉得拗口,但限于本人文采所限,实在想不出更好的篇目名,所以还是一如既往,将就吧。
   
    我们都知道,windows程序都能包含一些文件,比如ICO图标啊,对话框资源啊等等。除这些IDE自定义的类型以外,其实我们可以任意增加任意类型的文件;更绝的是,我们还能将这些任意类型的文件从程序中保存出来。想象一下,我们将某个exe文件保存到母程序中,当某一条件满足时,母程序将该子exe保存出来,然后再调用该子exe程序,那么剩下的事情就...
   
    好了,废话少说,我们先来看看如果保存资源文件。
   
    WriteResource是我写的保存资源文件的函数,函数体如下:   

  1. BOOL WriteResource(LPCTSTR pszFileName, HINSTANCE hInstance, LPCTSTR lpResourceName, LPCTSTR lpResourceType)
  2. {
  3.  BOOL bRes = FALSE;
  4.  HRSRC hRSRC = FindResource(hInstance, lpResourceName, lpResourceType);
  5.  DWORD dwError = GetLastError();
  6.  if( hRSRC )
  7.  {
  8.   DWORD nNumberOfBytesToWrite = SizeofResource(hInstance, hRSRC);
  9.   if( nNumberOfBytesToWrite )
  10.   {
  11.    HGLOBAL hRes = LoadResource(hInstance, hRSRC);
  12.    if( hRes )
  13.    {
  14.     PBYTE pRes = reinterpret_cast<PBYTE>(LockResource(hRes));
  15.     if( pRes )
  16.     {
  17.      HANDLE hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  18.      
  19.      DWORD dwBytesWritten;
  20.      bRes = WriteFile(hFile, pRes, nNumberOfBytesToWrite, &dwBytesWritten, NULL);
  21.      CloseHandle(hFile);
  22.     }
  23.     
  24.    // FreeResource(hRes);
  25.    }
  26.   }
  27.  }
  28.  return bRes;
  29. }

    在这里先简单地说一下该函数的形参:
    pszFileName: 资源文件保存到外部的文件名
    hInstance:程序的实例,该参数可以直接从WinMain中得到。
    lpResourceName:欲要保存的资源文件名,其实在具体使用中我们还需要用到MAKEINTRESOURCE宏。
    lpResourceType:资源的类型
   
    至于函数中各函数的意义,在MSDN和网上有大把资料,在这就不多说了。
   
    假设我们程序中将qq当成个资源包含进来,现在想程序运行时解压该程序然后再运行,则代码可以这么参考:

  1. int WINAPI WinMain( HINSTANCE hInstance,
  2.      HINSTANCE hPrevInstance,
  3.      LPTSTR    lpCmdLine,
  4.      int       nCmdShow)
  5. {
  6.   // TODO: Place code here.
  7.  const std::wstring strFile = TEXT("//QQ.exe");
  8.  WriteResource(strFile.c_str(),hInstance,MAKEINTRESOURCE(IDR_MYTYPE1),TEXT("MyType"));
  9.  PROCESS_INFORMATION prcInfo;
  10.  CreateProcess(strFile.c_str(),NULL,NULL,NULL,FALSE,NULL,NULL,NULL,NULL,&prcInfo);
  11.  return 0;
  12. }

    这个例子我已经上传到CSDN的下载栏目中,如果有需要可以直接下载。(http://download.csdn.net/source/850587
   
    在这里还需要说明一点容易让人忽略的,就是WriteResource函数的lpResourceType这个形参。其实取什么值和资源有关,甚至是导入时的操作有关。之所以在例子中给予该形参的类型为TEXT("MyType"),是因为我在导入资源时所给予的定义,如图所示:
   

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值