更新资源文件
2016-06-06 20:31
309 查看
UpdateResource
DavidCrow, 7
Sep 2003
4.85 (22 votes) |
|
Introduction
Over the years, I've seen various flavors of the question "How do I include a file or data with my program that I can extract at run-time and do something with it?" For example, the asker might have had a .WAV file or a .MDB(MSAccess) file that s/he wanted to include in the actual executable itself. For one reason or another, they do not want to package the two files separately. One advantage this has over a separate data/configuration file is that it'll never get lost. If the user
decides they want to start fresh, they can remove everything but the application itself, and when the application is started up again, it extracts an empty database, all without the user knowing the behind-the-scenes details.
So thre are really two questions on the table here: "How to include the file?" and "Once the file is included, how to extract it and 'use' it?" Let's look at a simple example.
Including the file
In this example, I'll show the necessary code to take the entire Windows calculator (calc.exe) and add it as a resource to some test .EXE. The .EXE could just as easily be the application where these code snippets reside. The firstthing we must do is open calc.exe in read-only mode, and read the entire file into a buffer.
Hide Copy Code
HANDLE hFile; DWORD dwFileSize, dwBytesRead; LPBYTE lpBuffer; hFile = CreateFile(L"C:\\Winnt\\System32\\calc.exe", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE != hFile) { dwFileSize = GetFileSize(hFile, NULL); lpBuffer = new BYTE[dwFileSize]; if (ReadFile(hFile, lpBuffer, dwFileSize, &dwBytesRead, NULL) != FALSE) { // do something with lpBuffer here } delete [] lpBuffer; CloseHandle(hFile); }
Updating the resource data
Now it's simply a matter of getting access to the resource data of the test file and updating it with the data pointed to by lpBuffer.
The third parameter to
UpdateResource()is the name we want to give the resource. I just chose an arbitrary name of
104.
Hide Copy Code
HANDLE hResource; hResource = BeginUpdateResource(L"C:\\...\\t3.exe", FALSE); if (NULL != hResource) { if (UpdateResource(hResource, RT_RCDATA, MAKEINTRESOURCE(104), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPVOID) lpBuffer, dwFileSize) != FALSE) { EndUpdateResource(hResource, FALSE); } }
At this point, you can actually open the test file with Visual Studio and see the addition of our data in the "Data" section. Be sure to open the file as a "resource"!
Extracting the data
So now your application has been delivered, and you need to extract the resource data.Extracting the resource data uses functions from the same family as
UpdateResource(). The required steps are to
load the file containing the resource data, find the desired resource, load the resource, and then lock it.
Hide Copy Code
HMODULE hLibrary; HRSRC hResource; HGLOBAL hResourceLoaded; LPBYTE lpBuffer; hLibrary = LoadLibrary(L"C:\\...\\t3.exe"); if (NULL != hLibrary) { hResource = FindResource(hLibrary, MAKEINTRESOURCE(104), RT_RCDATA); if (NULL != hResource) { hResourceLoaded = LoadResource(hLibrary, hResource); if (NULL != hResourceLoaded) { lpBuffer = (LPBYTE) LockResource(hResourceLoaded); if (NULL != lpBuffer) { // do something with lpBuffer here } } } FreeLibrary(hLibrary); }
Saving the data to a file
All that's left is to create a file with the data pointed to by lpBuffer. Nothing special needs to be done to the
data. It's the entire Windows calculator!
Hide Copy Code
DWORD dwFileSize, dwBytesWritten; HANDLE hFile; dwFileSize = SizeofResource(hLibrary, hResource); hFile = CreateFile(L"C:\\Winnt\\Temp\\calc2.exe", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (INVALID_HANDLE_VALUE != hFile) { WriteFile(hFile, lpBuffer, dwFileSize, &dwBytesWritten, NULL); CloseHandle(hFile); }
Now you should be able to run the newly created file, calc2.exe! As I indicated at the beginning of the article, this can be done with any sort of file that you want to include along with your main application or DLL.
License
This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.A list of licenses authors might use can be found here
Share
相关文章推荐
- 自学成才的秘密:115个 web Develop 资源
- C#中使用资源的方法分析
- Shell脚本实现Linux系统和进程资源监控
- 使用VS开发 Node.js指南
- vs 不显示行号的操作方法
- linux vs linux的优势
- Android资源命名规范 分享
- 先装VS再装IIS时出错的解决方法
- C#使用Dispose模式实现手动对资源的释放
- vs代码段快捷键设置(图文)
- .net非托管资源的回收方法
- VS中模仿WPF模板创建最简单的WPF程序
- 仿vs实现WPF好看的进度条
- Zend Framework教程之资源(Resources)用法实例详解
- 关于visual studio 2012 update 2中的新功能介绍
- 关于jQuery $.isNumeric vs. $.isNaN vs. isNaN
- 利用 filter 机制给静态资源 url 加上时间戳,来防止js和css文件的缓存问题
- Smarty使用自定义资源的方法
- python实现计算资源图标crc值的方法
- 【手顺】常用IDE Tab改为空格的设置