怎样将文件整合到VC程序中?
我为我的程序写了一个CHM帮助文档(13KB)。
但是希望用户直接下载EXE文件使用。
能不能把帮助文档的2进制代码填入程序的某个位置,等程序执行时生成这个文件呢?
应该是有方法的,希望大侠指点一二。
[解决办法]
将CHM文件作为资源同VC程序一想编绎生成EXE文件,程序运行时将此资料导出来,并用系统默认程序打开它即可
[解决办法]
我经常这样子处理,把文件保存在数组代码文件中
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);
}
}
[解决办法]
用资源好一些。