您的位置:首页 > 其它

vc资源 Windows资源 文件资源 自定义文件资源的读取

2016-04-08 16:53 471 查看
http://book.51cto.com/art/200908/145793.htm

Windows资源是一种特殊的存储形式,它通常存在于EXE和DLL模块中,常使用资源来存储程序需要的图标、工具栏等信息。

注意到当前运行的程序其资源文件在运行时期是只读的,所以说资源文件不适合那些需要动态更新的信息,必须在设计阶段就能确定的信息。举个例子,一些下拉框的信息可能来自于某些字典表,而这些字典项的内容在程序的运行期间是不变的(比如,性别包含两项:男、女),这个时候我们可以考虑采用资源文件。
另外一种场合,如果在程序中创建一个Word文件,可能需要一个Word模板,或者说我们的Access数据库可能需要一个空白的模板,而我们又不希望在程序发布时多带一个文件,那么这个时候,就需要使用资源文件了。

资源就存在当前正在运行的程序中,我们让这个程序读取自己的资源,这犹如一个高明的医生给自己做腹腔手术。

/***************************************************************

Windows提供的API函数



这里面仅仅列出常见类型(快捷键、位图、光标、图标、菜单、字符串)的资源的加载。下面是加载所有类型的资源的函数。
 



我们通常加载某个资源的步骤如下所示:

使用LoadLibrary()加载模块,或者获取当前应用程序的模块。

调用FindResource()从指定模块中查找指定的资源,返回该资源的句柄。

调用SizeofResource ()获取资源数据的长度。

调用LoadResource()将资源加载至内存。

调用LockResource()锁定资源,并返回指向资源数据的指针。

通过数据指针操作数据。

使用完毕,调用FreeResource()释放指定的资源。

/***************************************************************

现在动手
在当前程序中添加一个Word资源,并在运行时读取它。

选择【Win32】→【Win32项目】→【控制台程序】命令,创建ResLoader。
打开资源视图,导入一个Word文档(只要word就可以,将来程序读的就是该word中的文字),资源类型定义为"WORD",资源名为IDR_WORD1





  
 
从资源中加载自定义数据,编辑ResLoader.cpp



 

/***************************由于这是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;
}



 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: