MFC怎么打开chm文件或者pdf文件,苦求!

rayborn1105 2012-10-26 02:13:09
大家好,我的程序编写完后我写了一份使用说明,已经说明转换为chm格式和pdf格式,现在我想将使用说明以资源的形式加入程序中,然后在程序中通过按钮来打开此帮助文档。
1.我之前看的资料说用ShellExecute(),我使用了,但是只能对具体的路径,如打开C盘的某个文件,这样是可以的,但是我是想打开资源中的帮助文档。我通过函数得到了资源的指针,但是接下来就不知道怎么用了。。。。。

HRSRC hrFile = FindResource(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_CHM1), _T("CHM"));    
if(hrFile == NULL)
{
AfxMessageBox( _T("没有找到资源"));
}
DWORD dwSize = SizeofResource(NULL,hrFile); //获取资源大小


HGLOBAL hgFile = LoadResource(AfxGetInstanceHandle(),hrFile);
if(hgFile==NULL)
{
AfxMessageBox( _T("加载资源失败 "));
}

LPVOID pvFile = LockResource(hgFile);
if(pvFile==NULL)
{
AfxMessageBox( _T("不能加载内存 "));
}

接下来该怎么做呢?
2.另外我可以再dialog中添加WebBrowser控件,通过Navigate()方法可以打开相应的URL。我将HTML放入资源中通过
HINSTANCE hInstance = AfxGetResourceHandle();
ASSERT(hInstance != NULL);
CString strResourceURL;
BOOL bRetVal = TRUE;
LPTSTR lpszModule = new TCHAR[_MAX_PATH];

if (GetModuleFileName(hInstance, lpszModule, _MAX_PATH))
{
strResourceURL.Format(_T("res://%s/%d"), lpszModule, nRes);
AfxMessageBox(strResourceURL);
m_WebBrowser.Navigate(strResourceURL, 0, 0, 0, 0);

}
else
bRetVal = FALSE;
delete [] lpszModule;

可以直接打开HTML,WebBrowser控件可以打开PDF呀,为啥我同样在资源中加入PDF资源后,再使用这个方法就不能打开PDF格式的帮助文档了。

请各位大神帮我看看到底怎么才能以资源的形式打开我的帮助文档呢?因为文档时有图片的,因此最好是以chm或者pdf的格式打开,当然如果HTML格式的可以解决图片问题,那更好了。还望大家指点,谢谢了!
...全文
767 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
工程师123123123 2012-10-30
  • 打赏
  • 举报
回复
6楼和7楼的方法都可以,关键是你先把资源文件释放出来到一个指定目录下,释放时必定制定文件名,这样文件全名都知道了,再用shellexecute就不是难事了。
pig357 2012-10-30
  • 打赏
  • 举报
回复
把chm放在应用程序目录下,调用时直接是 目录\\1.chm
BeanJoy 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:

引用 2 楼 的回复:

ShellExecute(NULL,"open","your file path name",NULL,NULL,SW_SHOW)


我上面都说了,那个ShellExecute(),需要的是这个chm或者pdf的路径,但是我把chm或者pdf想放在MFC的资源里面,所以如果是这种情况,怎么得到它的路径呢?

哥子,你不会……
[/Quote]
GetTempFileName或GetTempPath之后,重命名为.chm或.pdf、自己新建.chm或.pdf,打开文件,写入文件,调用ShellExecute即可。变通方法多的是。
BombZhang 2012-10-30
  • 打赏
  • 举报
回复
4楼说的对啊,你可以先从资源里把文件释放到一个临时文件夹,然后。。。
BeanJoy 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:

ShellExecute(NULL,"open","your file path name",NULL,NULL,SW_SHOW)


我上面都说了,那个ShellExecute(),需要的是这个chm或者pdf的路径,但是我把chm或者pdf想放在MFC的资源里面,所以如果是这种情况,怎么得到它的路径呢?
[/Quote]
哥子,你不会把资源在临时目录生成生成一个PDF、CHM?
rayborn1105 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

ShellExecute(NULL,"open","your file path name",NULL,NULL,SW_SHOW)
[/Quote]

我上面都说了,那个ShellExecute(),需要的是这个chm或者pdf的路径,但是我把chm或者pdf想放在MFC的资源里面,所以如果是这种情况,怎么得到它的路径呢?
BombZhang 2012-10-30
  • 打赏
  • 举报
回复
ShellExecute(NULL,"open","your file path name",NULL,NULL,SW_SHOW)
rayborn1105 2012-10-30
  • 打赏
  • 举报
回复
没人回复么???????????
rayborn1105 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 12 楼 的回复:

引用 11 楼 的回复:

C/C++ code

HINSTANCE hInstance = AfxFindResourceHandle (MAKEINTRESOURCE (IDR_EXCEL1), RT_RCDATA) ;
HRSRC hRes = FindResource (hInstance, MAKEINTRESOURCE (IDR_EXC……
[/Quote]

呵呵,好了,就放在临时目录吧,谢谢你啦
BeanJoy 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 11 楼 的回复:

C/C++ code

HINSTANCE hInstance = AfxFindResourceHandle (MAKEINTRESOURCE (IDR_EXCEL1), RT_RCDATA) ;
HRSRC hRes = FindResource (hInstance, MAKEINTRESOURCE (IDR_EXCEL1), _T("excel")……
[/Quote]
当然可以,但是不能保证程序退出时,用户已经关闭了chm和pdf阅读器,因此程序退出时可能出现删不掉生成的文件,除非你强行把chm或pdf阅读器终止掉。
最好的做法是生成在临时目录,见6楼回复。
rayborn1105 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

C/C++ code

HINSTANCE hInstance = AfxFindResourceHandle (MAKEINTRESOURCE (IDR_EXCEL1), RT_RCDATA) ;
HRSRC hRes = FindResource (hInstance, MAKEINTRESOURCE (IDR_EXCEL1), _T("excel")) ;
HG……
[/Quote]

呵呵,谢谢,这个办法可以,先写入,然后在用ShellExecute()读出。但是这样就把文件一直写在目录下了。能不能当程序整个退出的时候就把这个文件删掉,然后下次调用的时候再创建?我用的单文档,呵呵
BeanJoy 2012-10-30
  • 打赏
  • 举报
回复

HINSTANCE hInstance = AfxFindResourceHandle (MAKEINTRESOURCE (IDR_EXCEL1), RT_RCDATA) ;
HRSRC hRes = FindResource (hInstance, MAKEINTRESOURCE (IDR_EXCEL1), _T("excel")) ;
HGLOBAL hResData = LoadResource (hInstance, hRes) ;
void * lpvData = LockResource (hResData) ;
int cbSize = SizeofResource (hInstance, hRes) ;
char path[512] ;
::GetCurrentDirectory (512, path) ;
CString temp;
temp.Format ("%s\\运动员.dat", path) ;
CFile file(temp, CFile::modeCreate | CFile::modeWrite);
file.SetLength (cbSize) ;
file.SeekToBegin () ;
file.WriteHuge (lpvData, cbSize) ;
file.Close () ;


以上代码将资源IDR_EXCEL1(一个空的Excel)保存到当前目录下运动员.dat。
BombZhang 2012-10-30
  • 打赏
  • 举报
回复
HRSRC hInfo=FindResource(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_DATA),RT_RCDATA);
HGLOBAL hRes=LoadResource(0,hInfo);
BYTE* pData=(BYTE*)LockResource(hRes);
DWORD dwSize=SizeofResource(AfxGetInstanceHandle(),hInfo);
//把pData的dwSize个BYTE保存到文件
rayborn1105 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 4 楼 的回复:

引用 3 楼 的回复:

引用 2 楼 的回复:

ShellExecute(NULL,"open","your file path name",NULL,NULL,SW_SHOW)


我上面都说了,那个ShellExecute(),需要的是这个chm或者pdf的路径,但是我把chm或者pdf想放在MFC的资源里面,所以如果是这种情况,怎么得到……
[/Quote]

要的就是这个办法,这个我不会啊,不然就弄好了。我在提问的时候就说明了,我没弄过那个。通过查看参考,我现在可以得到资源在内存中的指针,然后怎么把它保存在临时文件夹里啊,具体的函数,参数的什么能具体给出参考的代码么?感谢了!!!

16,472

社区成员

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

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

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