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


大家好,我的程序编写完后我写了一份使用说明,已经说明转换为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格式的可以解决图片问题,那更好了。还望大家指点,谢谢了!

14 个解决方案

#1


没人回复么???????????

#2


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

#3


引用 2 楼  的回复:
ShellExecute(NULL,"open","your file path name",NULL,NULL,SW_SHOW)


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

#4


引用 3 楼  的回复:
引用 2 楼  的回复:

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


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

哥子,你不会把资源在临时目录生成生成一个PDF、CHM?

#5


4楼说的对啊,你可以先从资源里把文件释放到一个临时文件夹,然后。。。

#6


引用 4 楼  的回复:
引用 3 楼  的回复:

引用 2 楼  的回复:

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


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

哥子,你不会……

GetTempFileName或GetTempPath之后,重命名为.chm或.pdf、自己新建.chm或.pdf,打开文件,写入文件,调用ShellExecute即可。变通方法多的是。

#7


把chm放在应用程序目录下,调用时直接是 目录\\1.chm 

#8


6楼和7楼的方法都可以,关键是你先把资源文件释放出来到一个指定目录下,释放时必定制定文件名,这样文件全名都知道了,再用shellexecute就不是难事了。

#9


引用 6 楼  的回复:
引用 4 楼  的回复:

引用 3 楼  的回复:

引用 2 楼  的回复:

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


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


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

#10


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保存到文件

#11



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。

#12


引用 11 楼  的回复:
C/C++ code

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


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

#13


引用 12 楼  的回复:
引用 11 楼  的回复:

C/C++ code

HINSTANCE hInstance = AfxFindResourceHandle (MAKEINTRESOURCE (IDR_EXCEL1), RT_RCDATA) ;
HRSRC hRes = FindResource (hInstance, MAKEINTRESOURCE (IDR_EXCEL1), _T("excel")……

当然可以,但是不能保证程序退出时,用户已经关闭了chm和pdf阅读器,因此程序退出时可能出现删不掉生成的文件,除非你强行把chm或pdf阅读器终止掉。
最好的做法是生成在临时目录,见6楼回复。

#14


引用 13 楼  的回复:
引用 12 楼  的回复:

引用 11 楼  的回复:

C/C++ code

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


呵呵,好了,就放在临时目录吧,谢谢你啦

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号