更新资源文件
来源:互联网 发布:客户档案软件 编辑:程序博客网 时间:2024/04/29 01:56
UpdateResource
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(MS Access) 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 first thing we must do is open calc.exe in read-only mode, and read the entire file into a buffer.
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
.
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.
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!
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
- 更新资源文件
- Xcode自行更新资源文件
- 资源更新
- Servlet 读取资源文件的方式,以及资源文件的更新
- ADF 可怜的更新上传和资源文件
- Android R资源文件无法更新或丢失
- XCODE调试时强制更新模拟器上的资源文件
- python 检索文件资源的方法 =>长期更新
- lua文件热更新无效和资源热更新无效的问题
- Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
- xcode更新资源后真机资源没更新
- Eclipse编译class文件无法更新,以及资源文件未生效
- maven install web层的类文件和资源文件无法更新
- Delphi 资源 (逐步更新)
- struts资源更新
- struts资源更新
- Silverlight学习资源更新
- ios游戏资源更新
- 布局的优化
- js之select二级联动
- 菜鸟的安卓之路2016.06.06
- Xcode 文件模板
- 第十三周上机实践项目:阅读、修改和运行关于交通工具类的程序(3)
- 更新资源文件
- Flip Game
- NI(美国国家仪器)二面
- 你不知道的全文检索---solrJ操作solr索引库(二)
- malloc、zalloc、calloc
- SpringEmail with Velocity template date and number formatting
- .NET-Dictionary索引重载 赋值时允许Key不存在
- listView
- 【Leetcode】Length of Last Word