VC中如何将添加到资源的文件保存到目标位置?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC中如何将添加到资源的文件保存到目标位置?相关的知识,希望对你有一定的参考价值。

是这样的,有两个文件需要以某种方式保存到VC生成的.exe文件中,以便下次点击即可将文件写入系统盘的某个地方。本来想用数组的方式保存的,但是文件比较大,所以想到导入到资源,请教大虾应当怎样把资源又写入到目标位置呢。当然,如果用其他方法实现此操作也行。我是菜鸟,麻烦写详细点,我会再加分的!

参考技术A 1、工程A要释放的程序是一个简单的MessageBox,源码如下:

view plaincopy to clipboardprint?
#include <windows.h>

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )

MessageBox(NULL,"资源文件释放实例!","测试",MB_OK);
return 0;

#include <windows.h>

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd )

MessageBox(NULL,"资源文件释放实例!","测试",MB_OK);
return 0;


编译生成MsgBox.exe,复制到工程B目录。

2、工程B为基于MFC对话框程序,先插入已经存EXE(或DLL)文件到VC资源文件中,如下图:

A、切换到资源视图,在上面单机右键:

B、单击"Import...",找到刚刚工程A编译生成的MsgBox.exe文件:

C、设置导入的资源类型名,这个名称将是该函数的第三个参数,我们取资源类型名为EXE:

D、此时,资源视图中多了一个类型为:EXE,资源ID为:IDR_EXE1,如下图:

E、增加一个按钮,添加响应事件,添加成员函数BOOL ReleaseRes(CString strFileName,WORD wResID,CString strFileType),具体代码如下:

view plaincopy to clipboardprint?
HCURSOR CTestDlg::OnQueryDragIcon()

return (HCURSOR) m_hIcon;


void CTestDlg::OnBtnRelease()

// TODO: Add your control notification handler code here
if(ReleaseRes("Test.exe",(WORD)IDR_EXE1,"EXE"))
MessageBox("释放文件成功!","提示",MB_OK);
else
MessageBox("释放文件失败!","提示",MB_OK);


/************************************************************************/
/* 函数说明:释放资源中某类型的文件
/* 参 数:新文件名、资源ID、资源类型
/* 返 回 值:成功返回TRUE,否则返回FALSE
/* By:Koma 2009.07.24 23:30
/************************************************************************/
BOOL CTestDlg::ReleaseRes(CString strFileName,WORD wResID,CString strFileType)

// 资源大小
DWORD dwWrite=0;

// 创建文件
HANDLE hFile = CreateFile(strFileName, GENERIC_WRITE,FILE_SHARE_WRITE,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if ( hFile == INVALID_HANDLE_VALUE )

return FALSE;


// 查找资源文件中、加载资源到内存、得到资源大小
HRSRC hrsc = FindResource(NULL, MAKEINTRESOURCE(wResID), strFileType);
HGLOBAL hG = LoadResource(NULL, hrsc);
DWORD dwSize = SizeofResource( NULL, hrsc);

// 写入文件
WriteFile(hFile,hG,dwSize,&dwWrite,NULL);
CloseHandle( hFile );
return TRUE;

HCURSOR CTestDlg::OnQueryDragIcon()

return (HCURSOR) m_hIcon;


void CTestDlg::OnBtnRelease()

// TODO: Add your control notification handler code here
if(ReleaseRes("Test.exe",(WORD)IDR_EXE1,"EXE"))
MessageBox("释放文件成功!","提示",MB_OK);
else
MessageBox("释放文件失败!","提示",MB_OK);


/************************************************************************/
/* 函数说明:释放资源中某类型的文件
/* 参 数:新文件名、资源ID、资源类型
/* 返 回 值:成功返回TRUE,否则返回FALSE
/* By:Koma 2009.07.24 23:30
/************************************************************************/
BOOL CTestDlg::ReleaseRes(CString strFileName,WORD wResID,CString strFileType)

// 资源大小
DWORD dwWrite=0;

// 创建文件
HANDLE hFile = CreateFile(strFileName, GENERIC_WRITE,FILE_SHARE_WRITE,NULL,
CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if ( hFile == INVALID_HANDLE_VALUE )

return FALSE;


// 查找资源文件中、加载资源到内存、得到资源大小
HRSRC hrsc = FindResource(NULL, MAKEINTRESOURCE(wResID), strFileType);
HGLOBAL hG = LoadResource(NULL, hrsc);
DWORD dwSize = SizeofResource( NULL, hrsc);

// 写入文件
WriteFile(hFile,hG,dwSize,&dwWrite,NULL);
CloseHandle( hFile );
return TRUE;


3、该函数是可重用类,本程序代码在VC6 + WIN SP3测试通过

参考资料:http://hi.baidu.com/175943462/blog/item/8056d7ace34a95004a36d637.html

本回答被提问者采纳
参考技术B 上面的用的办法很不错哦

以上是关于VC中如何将添加到资源的文件保存到目标位置?的主要内容,如果未能解决你的问题,请参考以下文章

将内容保存到文件中,然后将其读回并显示

vc中如何把一个目录包括目录下所有文件,以及子目录复制到指定目录中

VC Dll 中的资源 使用

vc中如何将dll件和exe编译成一个exe文件?

如何确定文件是不是已复制到目标

VC中如何让图像控件接收左键按下,抬起消息