把一个文件(随便的文件都行)加到工程的资源中,程序运行后想把它从程序里的资源中复制出来变成磁盘文件,请问大虾这种做法行吗?应该如何做啊??
解决方案 »
- 怎么在静态增加文本的CRICHEDIT中单击选中一行?
- 这个delete怎么出错了,谢谢帮我看看
- 如何获取系统中运行着的指定进程或窗口的图标?
- 一个关于CStdioFile的问题
- 华东理工的编程人进来!群6213544!方便交流!~有意者加入啊!
- 问个很菜的问题,工具条中的按钮怎样搞到256色一上,我用VC6.0?????
- ========一个关于HOOK的问题内复程序
- help
- 求助,关于VS开发工具
- 20分送上 改变控件的属性
- 用通用对话框选择保存的文件,怎么知道用户选择的文件类型。
- 请问CBitmap的BOOL LoadBitmap(LPCTSTR lpszResourceName)怎么用?
HINSTANCE hInst = AfxGetInstanceHandle(); // Load the user-defined resource.
HRSRC hExeFile = ::FindResource(hInst, "STUB.EXE", "EXE_RESOURCE");
HGLOBAL hRes = ::LoadResource(hInst, hExeFile);
DWORD dwSize = ::SizeofResource(hInst, hExeFile); if (hRes != NULL)
{
UINT FAR* lpnRes = (UINT FAR*)::LockResource(hRes); TRY
{
// Create the .exe file
CFile file(lpszFileName, CFile::modeCreate | CFile::modeWrite); // Write the user-defined resource to the .exe file
file.WriteHuge(lpnRes, dwSize);
file.Flush();
}
CATCH(CFileException, e)
{
}
END_CATCH
::FreeResource(hRes);
return TRUE;
}
void CInstallBuilderApp::AppendFile(LPCTSTR lpszFileName, FILE* file)
{
FILE* inputfile;
int ch;
FILETIME filetime[3];
HANDLE hFile = CreateFile(lpszFileName, GENERIC_READ,
FILE_SHARE_READ, 0, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0 );
if (hFile == INVALID_HANDLE_VALUE )
{
CString strError;
strError.Format("File %s not found!", lpszFileName);
AfxMessageBox(strError);
return;
} GetFileTime(hFile, &filetime[0], &filetime[1], &filetime[2]);
CloseHandle(hFile); // 'begin of file' er
CString strTag = "{58A60076-593E-414e-8152-BD3516480CAA}";
strTag.MakeReverse();
// write er
fwrite(strTag, strTag.GetLength(), 1, file);
// write time stamps(used for restoring original time stamps)
fwrite(filetime, sizeof(FILETIME), 3, file); // write filename
CString strFileName = lpszFileName;
int nPos = strFileName.ReverseFind('\\');
if (nPos >= 0)
strFileName = strFileName.Right(strFileName.GetLength() - nPos - 1);
fwrite(strFileName, strFileName.GetLength() + 1, 1, file);
// copy all bytes to setup package
if ((inputfile = fopen(lpszFileName, "rb")) != NULL)
{
while ((ch = fgetc(inputfile)) != EOF)
fputc(ch, file);
fclose(inputfile);
}
}
首先我们将各个模块作为资源加入资源中。定义整数标识和类型。这些资源文件打包将在程序运行的时候解出。 以下是从资源释放到文件的函数:
int res2file(LPCTSTR lpName,LPCTSTR lpType,LPCTSTR filename)
{
//输入:lpName 为资源名,可用MAKEINTRESOURCE()宏将整型变为字符串。
//LpType 为串类型名
//Filename 为释放出的文件名。
//输出:成功1,失败0
HRSRC myres = FindResource (NULL,lpName,lpType);
HGLOBAL gl = LoadResource (NULL,myres);
LPVOID lp = LockResource(gl);//返回指向资源内存的地址的指针。
// CREATE_ALWAYS为不管文件存不存在都产生新文件。
HANDLE fp = CreateFile(filename ,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);if (!fp)
return false;
DWORD a;
//sizeofResource 得到资源文件的大小
if(!WriteFile (fp,lp,SizeofResource(NULL,myres),&a,NULL))
return false;
CloseHandle(fp);
FreeResource(gl);
return true;
}
以下是调用的方法:
res2file (MAKEINTRESOURCE(IDR_ZF),"swf","zf.swf");
res2file (MAKEINTRESOURCE(IDR_ZG),"swf","zg.swf");
res2file (MAKEINTRESOURCE(IDR_DOT),"acs","DOT.ACS");
res2file (MAKEINTRESOURCE(IDR_SHARE),"dll","share.dll");
res2file (MAKEINTRESOURCE(IDR_TALK),"dll","talk.dll");
res2file (MAKEINTRESOURCE(IDR_SWFLASH),"ocx","swflash.ocx");