怎样将文件整合到VC程序中?

jqgsninimo 2007-04-26 04:06:22
我为我的程序写了一个CHM帮助文档(13KB)。
但是希望用户直接下载EXE文件使用。
能不能把帮助文档的2进制代码填入程序的某个位置,等程序执行时生成这个文件呢?
应该是有方法的,希望大侠指点一二。
...全文
272 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jqgsninimo 2007-04-26
  • 打赏
  • 举报
回复
TO AthlonxpX86(一坨屎)
的确像 uoyevoli(爱什么呢?www.FARPROC.com) 说的那样,用资源好一些。你的方法好复杂啊。不过我会研究一下的。谢谢您提供您的方法给我。

TO ALL
好了,采用 PentiumMMX() 的方法问题得到解决,现在结贴散分。
uoyevoli 2007-04-26
  • 打赏
  • 举报
回复
用资源好一些。
AthlonxpX86 2007-04-26
  • 打赏
  • 举报
回复
我经常这样子处理,把文件保存在数组代码文件中

unsigned char file[]=
{
........
}


下面是数组代码文件的生成方法
HCURSOR CBINToCodeDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
BOOL GetCpp(IN char * pInBuf,IN char *pName,OUT char *pOutBuf,DWORD &len)
{
//memset(pOutBuf,Inlen*6+64);
sprintf(pOutBuf,"#include \"stdafx.h\" \r\n");
sprintf((char *)(pOutBuf+strlen(pOutBuf)),"#include \"%s.h\" \r\n",pName);
sprintf((char *)(pOutBuf+strlen(pOutBuf)),"\t DWORD n%sSize=%d;\r\n",pName,len);
sprintf((char *)(pOutBuf+strlen(pOutBuf)),"\t unsigned char %sData[]={\r\n\t\t",pName);
for(int i=1;i<=len;i++)
{
sprintf((char *)(pOutBuf+strlen(pOutBuf)),"0x%02X,",(unsigned char)pInBuf[i-1]);
if(i%64==0)
{
sprintf((char *)(pOutBuf+strlen(pOutBuf)),"\r\n\t\t");
}
}
sprintf((char *)(pOutBuf+strlen(pOutBuf)-1),"\r\n};\r\n\r\n\r\n");
len=strlen(pOutBuf);
return TRUE;
}
BOOL GetHpp(IN char * pInBuf,IN char *pName,OUT char *pOutBuf,DWORD &len)
{
//memset(pOutBuf,Inlen*6+64);
char RandID[256];
srand(GetTickCount());
sprintf(&RandID[0],"_%08X_%08X_%08X_%08X_%08X_%08X_%08X_%08X_",
rand(),rand(),rand(),rand(),rand(),rand(),rand(),rand());
sprintf(pOutBuf,"#ifndef %s\r\n#define %s\r\n\r\n",RandID,RandID);
sprintf((char *)(pOutBuf+strlen(pOutBuf)),"\t extern DWORD n%sSize;\r\n",pName);
sprintf((char *)(pOutBuf+strlen(pOutBuf)),"\t extern unsigned char %sData[];\r\n\r\n",pName);
sprintf((char *)(pOutBuf+strlen(pOutBuf)),"#endif\r\n\r\n\r\n");
len=strlen(pOutBuf);
return TRUE;
}
void CBINToCodeDlg::OnOpen()
{
// TODO: Add your control notification handler code here
CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,"MIDI(*.*)|*.*",NULL);
if(IDOK==dlg.DoModal())
{
CString path=dlg.GetPathName();
CString tmppath=path;//.Left(path.Find('\\',))
tmppath.MakeReverse();
tmppath.Delete(0,tmppath.Find('\\'));
tmppath.MakeReverse();
HANDLE pfile=CreateFile(path.GetBuffer(path.GetLength()),
GENERIC_READ|GENERIC_WRITE, // open for reading
FILE_SHARE_WRITE|FILE_SHARE_READ, // share for reading
NULL, // no security
OPEN_ALWAYS, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL);
if(pfile==INVALID_HANDLE_VALUE)
{
return;
}
DWORD MidLen=GetFileSize(pfile,NULL);
char * pMidBuf=new char [MidLen];
DWORD OutSize=MidLen*6+64;

char * pOutData=new char [OutSize];
memset(pOutData,0,MidLen*6+64);
ReadFile(pfile,pMidBuf,MidLen,&MidLen,NULL);


CString szFileName=dlg.GetFileName();
//szFileName.Delete(szFileName.Find('.'),4);
CString tmp=szFileName.Left(szFileName.Find('.'));
szFileName=tmp;

GetCpp(pMidBuf,szFileName.GetBuffer(szFileName.GetLength()),pOutData,MidLen);

CString cpppath;
cpppath.Format("%s%s.cpp",tmppath,szFileName);
HANDLE pwfile=CreateFile(cpppath.GetBuffer(cpppath.GetLength()),
GENERIC_READ|GENERIC_WRITE, // open for reading
FILE_SHARE_WRITE|FILE_SHARE_READ, // share for reading
NULL, // no security
OPEN_ALWAYS, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL);
if(pfile==INVALID_HANDLE_VALUE)
{
return;
}
WriteFile(pwfile,pOutData,MidLen,&MidLen,NULL);

memset(pOutData,0,GetFileSize(pfile,NULL)*6+64);
GetHpp(pMidBuf,szFileName.GetBuffer(szFileName.GetLength()),pOutData,MidLen);
CString hpath;
hpath.Format("%s%s.h",tmppath,szFileName);
HANDLE phfile=CreateFile(hpath.GetBuffer(hpath.GetLength()),
GENERIC_READ|GENERIC_WRITE, // open for reading
FILE_SHARE_WRITE|FILE_SHARE_READ, // share for reading
NULL, // no security
OPEN_ALWAYS, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL);
if(pfile==INVALID_HANDLE_VALUE)
{
return;
}
WriteFile(phfile,pOutData,MidLen,&MidLen,NULL);

CloseHandle(phfile);
CloseHandle(pfile);
CloseHandle(pwfile);
}
}
jqgsninimo 2007-04-26
  • 打赏
  • 举报
回复
TO PentiumMMX()
太感谢了,问题解决后给你分.
PentiumMMX 2007-04-26
  • 打赏
  • 举报
回复
在Resource面板上,右键[Import..]将CHM文件导入到资源中,并为资料取类型名为CHM
此资源ID号为ID_CHM1

////从本EXE中导出资源函数

调用时参数意义:
UINT nRes: 自定义类型"CHM"下的一个资源的ID号,本例为ID_CHM1
CString ResName:自定义的资料类型名称,本例为"CHM"
CString fileName:将EXE中的指定类型,指定ID号的资源导出保存为一外部文件名


//下面的函数可以导出EXE中任何类型的资源到一个文件中
BOOL CMyDlg::SaveResToFile(UINT nRes, CString ResName, CString fileName)
{
LPCTSTR pszResID = MAKEINTRESOURCE(nRes); //参数为资源的ID号
HINSTANCE hApp = ::GetModuleHandle(0);
ASSERT(hApp);

HRSRC hResInfo;
hResInfo = ::FindResource(hApp, pszResID, TEXT(ResName)); //参数为资源的项名称

if(hResInfo == 0)
return FALSE;

HGLOBAL hRes = ::LoadResource(hApp, hResInfo);
if(hRes == 0)
return FALSE;

LPVOID pVoid = ::LockResource(hRes);
if(pVoid == 0)
return FALSE;

DWORD dwTheSize = ::SizeofResource(hApp, hResInfo);
CFile wFile;
if(wFile.Open(fileName,CFile::modeCreate | CFile::modeWrite | CFile::typeBinary))
{
wFile.Write(pVoid,dwTheSize);
wFile.Close();
return TRUE;
}

return FALSE;
}
jqgsninimo 2007-04-26
  • 打赏
  • 举报
回复
TO PentiumMMX()
具体怎么做啊?能不能详细解释一下?
PentiumMMX 2007-04-26
  • 打赏
  • 举报
回复
将CHM文件作为资源同VC程序一想编绎生成EXE文件,程序运行时将此资料导出来,并用系统默认程序打开它即可

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧