从而达到控制台程序的GUI化,而这之中很重要的的一个环节就是将源程序与我们做的GUI程序编译到一快,这使用到VC中资源定制的功能。
资源即数据,它们被储在程序的EXE文件中,但是它们并非驻留在程序的数据区域中也就是说资源不能通过程序源代码中定义的变量来直接访问,要使用资源就必须使用windows提供的API函数:
FineResource:查找一个资源。我们是把相关要生成的文件载入,就是用这个函数来确定其资源的位置。
SizeofResource:获得资源的尺寸。
LoadResource:装载资源,装入到内存中。
LockResource:锁定资源,在内存中锁定。
这里每一个函数的返回值分别作为下一个函数的参数,详细介绍一下。
FindResource用来在一个指定的模块中定位所指定的资源:
HRSRC FindResource(
HMODULE hModule, //包含所需资源的模块句柄,如果是程序本身,可以置为NULL
LPCTSTR lpName, //可以是资源名称或资源ID
LPCTSTR lpType //资源类型,在这里也就是我们自己指定的资源类型
);
LoadResource用来将所指定的资源加载到内存当中; HGLOBAL LoadResource(
HMODULE hModule, //模块句柄,同上
HRSRC hResInfo //需要加载的资源句柄,这里也就是FindResource的返回值
);
LockResource用来锁定内存中的资源数据块,它的返回值也就是我们要使用的直系指向资源数据的内存指针; LPVOID LockResource(
HGLOBAL hResData //指向内存中要锁定的资源数据块,这里也就是LoadResource的返回值
);
另外我们还需要用SizeofResource来确定资源的尺寸,我们在操作资源时要用到它。
为了方便说明我们来写个基于对话框的小程序,并将ping.exe这个程序以资源的方式加载进去,运行时会在C:/目录下生成一个ping.exe
整个思路如下:
1建立一个对话框程序MAIN
2将ping.exe作为MAIN的资源一同编译
3查找,加载,锁定资源数据
4将数据生成为文件
第一步
建立一个新的对话框项目
第二步
将面板切换到ResourceView面板 右击 最上面的resources* 文件夹图标
选择 Insert 这时会弹出如下“插入资源”对话框
选择“M导入”弹出“导入资源”对话框
在“导入资源”的“文件类型”选所有文件
最后选要加载的文件这里是ping.exe
之后会弹出“定制资源类型”对话框 如图
类型名可以随意填写这里填PING
插入后编译程序时ping.exe将做为对话框的资源编译进去
第三步
成功加载后 使用时需要释放出来在来例中可以使用如下代码实现
HRSRC hr=FindResource(0,MAKEINTRESOURCE(IDR_PING),"PING");
if(hr==NULL)
MessageBox("hr error");
dwSize=SizeofResource(NULL,hr);
HGLOBAL hg=LoadResource(NULL,hr);
if(hg==NULL)
MessageBox("hg error");
LPSTR lp=(LPSTR)LockResource(hg);
if(lp==NULL)
MessageBox("lp error");
第四步
当完成第三步后 就是生成ping.exe文件了
可通过如下代码实现
DWORD dwSize, dwWritten;
HANDLE hFile;
hFile =
CreateFile("c://ping.exe",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
if(hFile == NULL)
MessageBox("create file error");
WriteFile(hFile,(LPCVOID)LockResource(hg),dwSize,&dwWritten,NULL);
CloseHandle(hFile);
这样就会在C:/目录下还原ping.exe
总结
资源的定制的关键还是在于查找,加载,锁定资源数据........
与本文相关代码 在VC6.0下面编译无误
![](http://hofun.net/bbsxp/images/affix.gif)