描述:
我在VC6里面跟着向导做了一个Active Document Server,工作起来还算正常,我的自定义文件拖入到IE中时也能正常显示。在打开某个文件时,我获取它所在文件夹下所有支持的文件的文件名,在左边的一个列表里显示出来。这些在程序单独运行时都没有问题,只是在文件拖入到IE中打开时,左边的这个列表就是无法显示出文件名的表。我用了一堆的AfxMessageBox()来跟踪(-_-#),发现在IE中打开文件时,列表控件确实执行了加入文件名的操作,可是每次返回总是0。而在Inplace Frame的OnCreateControlBar(...)中,执行加入字符串的操作却是正常的。实在让我觉得费解。这是为什么呢?
我在Doc文件里,OnOpenDocument之后就判断IsEmbeded(),TRUE就获取CInPlaceFrame的指针,FALSE就获取CMainFrame的指针,然后调用各自的LoadFileList()——这里本来我是用SendMessage(...)的,可是对CInPlaceFrame发消息总不成功,只好改成调用函数。这两个LoadFileList是一样的,在里面用m_ListCtrl.InsertItem(...)来加入文件名的列表。
我对Active Document没很多了解,基本上工作都是在Doc和View里面来做,而CInPlaceFrame和CMainFrame基本上是两副相同的代码,来控制toolbar和control bar。完全没有管DocObjectServerItem。这样的做法是不是很不对?
还有一些别的问题
1 这样的程序怎么在IE里面调呢?我都只好写了一堆的AfxMessageBox一步一步的看-_-#
2 在doc里面有两个好像应该优先被重载的函数CreateInPlaceFrame(CWnd* pParentWnd)和DestroyInPlaceFrame(COleIPFrameWnd* pFrameWnd)。我重载了DestroyInPlaceFrame(COleIPFrameWnd* pFrameWnd),加入
delete pFrameWnd;
pFrameWnd=NULL;
我的程序就能在关闭IE后退出了,之前总是关闭IE后可程序本身都还在进程管理器里面。这样退出对吗?因为我只是自己猜测这样做的。
但是CreateInPlaceFrame(CWnd* pParentWnd)我都不知道应该怎么重载-_-#,不知道它该干什么。
3 doc里面的m_pInPlaceFrame是指的inplace frame么?我怎么总得到它是NULL?而获取CInPlaceFrame的指针的时候我只好用
CWnd* pWnd = AfxGetMainWnd();
CFrameWnd* pFrameWnd = reinterpret_cast<CFrameWnd*>(pWnd);
CFrameWnd* pAF = pFrameWnd->GetActiveFrame();
CInPlaceFrame* pFrame = reinterpret_cast<CInPlaceFrame*>(pAF);
这样获得的pFrame无法对其SendMessage,调用里面的函数却可以。是不是有问题?
只想快点做完这个程序就好,请各位GGJJDDMM帮忙,不胜感激!!
解决方案1:
可能类型转换问题
执行程序设置成IE
窗口先确定窗口句柄是否有效
估计你用的是 MFC封装 的类
ms 提供了一个 装载 msoffice的例子,可以参考,不过没用mfc
没做过,帮你顶,看了一遍,看不出什么毛病。
CWnd* pWnd = AfxGetMainWnd();
CFrameWnd* pFrameWnd = reinterpret_cast<CFrameWnd*>(pWnd);
CFrameWnd* pAF = pFrameWnd->GetActiveFrame();
CInPlaceFrame* pFrame = reinterpret_cast<CInPlaceFrame*>(pAF);
类型转换不知道做的对不对?