vc资源 Windows资源 文件资源 自定义文件资源的读取
2016-04-08 16:53
471 查看
http://book.51cto.com/art/200908/145793.htm
Windows资源是一种特殊的存储形式,它通常存在于EXE和DLL模块中,常使用资源来存储程序需要的图标、工具栏等信息。
注意到当前运行的程序其资源文件在运行时期是只读的,所以说资源文件不适合那些需要动态更新的信息,必须在设计阶段就能确定的信息。举个例子,一些下拉框的信息可能来自于某些字典表,而这些字典项的内容在程序的运行期间是不变的(比如,性别包含两项:男、女),这个时候我们可以考虑采用资源文件。
另外一种场合,如果在程序中创建一个Word文件,可能需要一个Word模板,或者说我们的Access数据库可能需要一个空白的模板,而我们又不希望在程序发布时多带一个文件,那么这个时候,就需要使用资源文件了。
资源就存在当前正在运行的程序中,我们让这个程序读取自己的资源,这犹如一个高明的医生给自己做腹腔手术。
/***************************************************************
Windows提供的API函数
![](http://img2.ph.126.net/5Po1T8-QwlJ1_c-o6KTQ9g==/6598107705634593305.png)
这里面仅仅列出常见类型(快捷键、位图、光标、图标、菜单、字符串)的资源的加载。下面是加载所有类型的资源的函数。
![](http://img0.ph.126.net/EhoX-QT66lIha4EvfzGBTA==/3336885849005026740.png)
我们通常加载某个资源的步骤如下所示:
使用LoadLibrary()加载模块,或者获取当前应用程序的模块。
调用FindResource()从指定模块中查找指定的资源,返回该资源的句柄。
调用SizeofResource ()获取资源数据的长度。
调用LoadResource()将资源加载至内存。
调用LockResource()锁定资源,并返回指向资源数据的指针。
通过数据指针操作数据。
使用完毕,调用FreeResource()释放指定的资源。
/***************************************************************
现在动手
在当前程序中添加一个Word资源,并在运行时读取它。
选择【Win32】→【Win32项目】→【控制台程序】命令,创建ResLoader。
打开资源视图,导入一个Word文档(只要word就可以,将来程序读的就是该word中的文字),资源类型定义为"WORD",资源名为IDR_WORD1
![](http://img0.ph.126.net/sdBfqVgf-H44AyxDlcAj1Q==/3401343618671783019.png)
![](http://img1.ph.126.net/ZnXPxnLVGB2zRN4wl-r8Uw==/6598065924192735274.png)
从资源中加载自定义数据,编辑ResLoader.cpp
![](http://img1.ph.126.net/70X19S2YiTWu_oUcmXYkXA==/88101667810499926.png)
/***************************由于这是win32控制台应用程序,添加了资源后,在stafx.h中要#include "resource.h"并且该程序用到了MFC中的类选择工程(项目)属性,修改一下MFC的使用,在共享dll中使用MFC项目 ---- 属性 ---- 配置属性 ---- 常规 -----MFC使用 ---在共享DLL中使用MFC然后还需要包含头文件afxwin.h最后程序就可以运行了程序运行时,会自动在当前目录下生成一个out.doc文件,并自动启动Word打开它。注意ShellExecute()函数的使用,它用以执行一条系统命令,如打开某个文件。***************************/
#include "stdafx.h"
#include <afxwin.h>
CWinApp theApp;
int _tmain(int argc, _TCHAR* argv[])
{
int nRetCode = 0;
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
_tprintf(_T("错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
HRSRC hRes = FindResource(theApp.m_hInstance, MAKEINTRESOURCE(IDR_WORD1), _T("WORD"));
DWORD len = SizeofResource(theApp.m_hInstance, hRes);
HGLOBAL hg = LoadResource(theApp.m_hInstance, hRes);
LPVOID lp = (LPSTR)LockResource(hg);
//将资源中的内容保存至某个Word文件中
CFile file;
file.Open(_T("out.doc"), CFile::modeWrite | CFile::modeCreate);
char * cp = (char *)lp;
for(int i = 0; i < len; i++)
{
file.Write(cp++, 1);
}
CString filePath = file.GetFilePath();
file.Close();
//打开该文件
ShellExecute(NULL, _T("open"),
filePath, NULL, NULL, SW_SHOW);
FreeResource(hg);
}
return nRetCode;
}
![](http://img2.ph.126.net/Z0m__qoRIwrRbcBxYtd3Dg==/6598202263634584226.png)
Windows资源是一种特殊的存储形式,它通常存在于EXE和DLL模块中,常使用资源来存储程序需要的图标、工具栏等信息。
注意到当前运行的程序其资源文件在运行时期是只读的,所以说资源文件不适合那些需要动态更新的信息,必须在设计阶段就能确定的信息。举个例子,一些下拉框的信息可能来自于某些字典表,而这些字典项的内容在程序的运行期间是不变的(比如,性别包含两项:男、女),这个时候我们可以考虑采用资源文件。
另外一种场合,如果在程序中创建一个Word文件,可能需要一个Word模板,或者说我们的Access数据库可能需要一个空白的模板,而我们又不希望在程序发布时多带一个文件,那么这个时候,就需要使用资源文件了。
资源就存在当前正在运行的程序中,我们让这个程序读取自己的资源,这犹如一个高明的医生给自己做腹腔手术。
/***************************************************************
Windows提供的API函数
![](http://img2.ph.126.net/5Po1T8-QwlJ1_c-o6KTQ9g==/6598107705634593305.png)
这里面仅仅列出常见类型(快捷键、位图、光标、图标、菜单、字符串)的资源的加载。下面是加载所有类型的资源的函数。
![](http://img0.ph.126.net/EhoX-QT66lIha4EvfzGBTA==/3336885849005026740.png)
我们通常加载某个资源的步骤如下所示:
使用LoadLibrary()加载模块,或者获取当前应用程序的模块。
调用FindResource()从指定模块中查找指定的资源,返回该资源的句柄。
调用SizeofResource ()获取资源数据的长度。
调用LoadResource()将资源加载至内存。
调用LockResource()锁定资源,并返回指向资源数据的指针。
通过数据指针操作数据。
使用完毕,调用FreeResource()释放指定的资源。
/***************************************************************
现在动手
在当前程序中添加一个Word资源,并在运行时读取它。
选择【Win32】→【Win32项目】→【控制台程序】命令,创建ResLoader。
打开资源视图,导入一个Word文档(只要word就可以,将来程序读的就是该word中的文字),资源类型定义为"WORD",资源名为IDR_WORD1
![](http://img0.ph.126.net/sdBfqVgf-H44AyxDlcAj1Q==/3401343618671783019.png)
![](http://img1.ph.126.net/ZnXPxnLVGB2zRN4wl-r8Uw==/6598065924192735274.png)
从资源中加载自定义数据,编辑ResLoader.cpp
![](http://img1.ph.126.net/70X19S2YiTWu_oUcmXYkXA==/88101667810499926.png)
/***************************由于这是win32控制台应用程序,添加了资源后,在stafx.h中要#include "resource.h"并且该程序用到了MFC中的类选择工程(项目)属性,修改一下MFC的使用,在共享dll中使用MFC项目 ---- 属性 ---- 配置属性 ---- 常规 -----MFC使用 ---在共享DLL中使用MFC然后还需要包含头文件afxwin.h最后程序就可以运行了程序运行时,会自动在当前目录下生成一个out.doc文件,并自动启动Word打开它。注意ShellExecute()函数的使用,它用以执行一条系统命令,如打开某个文件。***************************/
#include "stdafx.h"
#include <afxwin.h>
CWinApp theApp;
int _tmain(int argc, _TCHAR* argv[])
{
int nRetCode = 0;
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
_tprintf(_T("错误: MFC 初始化失败\n"));
nRetCode = 1;
}
else
{
HRSRC hRes = FindResource(theApp.m_hInstance, MAKEINTRESOURCE(IDR_WORD1), _T("WORD"));
DWORD len = SizeofResource(theApp.m_hInstance, hRes);
HGLOBAL hg = LoadResource(theApp.m_hInstance, hRes);
LPVOID lp = (LPSTR)LockResource(hg);
//将资源中的内容保存至某个Word文件中
CFile file;
file.Open(_T("out.doc"), CFile::modeWrite | CFile::modeCreate);
char * cp = (char *)lp;
for(int i = 0; i < len; i++)
{
file.Write(cp++, 1);
}
CString filePath = file.GetFilePath();
file.Close();
//打开该文件
ShellExecute(NULL, _T("open"),
filePath, NULL, NULL, SW_SHOW);
FreeResource(hg);
}
return nRetCode;
}
![](http://img2.ph.126.net/Z0m__qoRIwrRbcBxYtd3Dg==/6598202263634584226.png)
相关文章推荐
- Activity全屏的方法
- 『C++ Primer学习笔记』Chapter 4
- opencv 第十章 《跟踪与运动》知识点整理、总结
- 表格练习
- js中setTimeOut()和setInterval()的使用--程序执行时间控制
- 角色类游戏,析构函数
- iOS __runtime
- Informatica 错误:Cannot convert from SQL type 93 to C type 4
- 发送带有正文以及附件的邮件
- css3 渐变实例
- Android 开源框架Universal-Image-Loader完全解析(一)--- 基本介绍及使用
- 【学习笔记】3D图形核心基础精炼版-6:stage3D实战-顶点
- yum安装nginx
- PopupWindow浮动窗
- qwebview打开图片链接
- WebView——WebViewClient/WebChomeClient
- 加密类型
- JAVA之——经典算法50题
- 游戏之帮组策划,设计策划填表方法
- Oracle Study之-Oracle 11g OCM考试大纲