把外部文件写入自己的EXE文件中

制作安装包时,涉及的技术包括安装位置设定、目录创建、相关文件的拷贝、数据库初始化、相关文件的注册、打包成单一文件及其它初始化等,一般我们都喜欢把这些复杂的工作交给专业打包工具如InstallShield等来处理。但只要善于整理,不借助专业打包工具,仅使用VC自己打包也很可行。

使用VC打包的难点在于把所有文件打包成单一文件,本文将使用一示例主要解决此问题。

  1. 在VC工程中,导入其它文件(这里使用exe格式的可执行文件),Resource Type使用EXE,资源名:IDR_EXE1;
  2. 对话框工程中添加函数如下:
BOOL CMyDlg::ReleaseRes(CString strFileName, WORD wResID, CString strFileType)
{
        DWORD dwWrite = 0;//资源文件大小    
         HANDLE hFile = CreateFile(strFileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);  //创建文件 

       if (hFile == INVALID_HANDLE_VALUE)          return FALSE;
         
         HRSRC hSrc = FindResource(NULL, MAKEINTRESOURCE(wResID), strFileType);  //查找资源文件,加载资源到内存,得到资源文件大小
        HGLOBAL hG = LoadResource(NULL, hSrc);
        DWORD dwSize = SizeofResource(NULL, hSrc);       

         WriteFile(hFile, hG, dwSize, &dwWrite, NULL);//写入文件
        CloseHandle(hFile);
        return TRUE;
}

  3. 在需要的地方调用执行此函数即可:

ReleaseRes("Test.exe", DWORD(IDR_EXE1), "EXE");

 另外还可以把其它文件写入指定exe文件结尾而不影响原exe文件运行,以及exe文件可以读取或者复印其本身,利用此原理便可制作自解压软件,当然也可以更好的制作安装包。

原文地址:https://www.cnblogs.com/Roarsun/p/2831205.html