To: qing_li73(bluemoon) 我照了这个例子(http://www.chinaoak.com/download/material/techtips/vc-learn/VC/MFC-WORD.htm)做了之后出现了一个问题,就是在onDraw函数中调用OnGetItemPosition时提示出保护成员无法调用,如果不修改onDraw的话出来的程序word在客户区占的地方又很小,打出的字也很小。
to xfjkiss(西门吹雪)我也照了这个例子(http://www.chinaoak.com/download/material/techtips/vc-learn/VC/MFC-WORD.htm)做了.但是,执行到 CreateNewItem() 时失败报错:建立对象失败。请确认该对象已被注册入系统求教怎么解决?你说的问题,只要把OnGetItemPosition变成public就行了。
在按vcracoon(vcracoon) 步骤操作的过程中,发现在我的安装文件夹下找不到“2. 首先应从Microsoft Visual C++集成开发环境中点击View菜单下的ClassWizard子菜单,选择Automation选项卡,点击Add Class并选择“From a TypeLibrary”,找到Office目录并选中Microsoft Word 97 类型库Word8.olb,选中所有类。点击OK,关闭MFC ClassWizard对话框。此时通过MFC,Visual C++ ClassWizard从Microsoft Word type library生成“wrapper classes”。”中所说的Word8.olb,当然我知道应该是MSWORD9.OLB,于是我就到我的备份盘(我把常用的软件都备份载了硬盘上,安装也都是从硬盘上进行)去找,果然找到了,由此我想到是不是有可能使这个原因引起的?office自动化方面还从未涉及过,今天过来也主要是学习一下,呵呵。
to romberg2002() 谢谢老兄的提醒,不过我好像没有office 97的盘了 能不能麻烦你,方便的话把word8.olb这个文件发给我啊! [email protected]
http://www.codeproject.com/com/xoffice.asp
http://www.codeproject.com/com/ole_automation.asp
2. 首先应从Microsoft Visual C++集成开发环境中点击View菜单下的ClassWizard子菜单,选择Automation选项卡,点击Add Class并选择“From a TypeLibrary”,找到Office目录并选中Microsoft Word 97 类型库Word8.olb,选中所有类。点击OK,关闭MFC ClassWizard对话框。此时通过MFC,Visual C++ ClassWizard从Microsoft Word type library生成“wrapper classes”。
3. 删除"IDD_AUTOPROJECT_DIALOG"对话框上的所有控件,添加一个Command Button命名为"IDRUN",标题为"Run"。为IDRUN添加单击事件的消息捕获函数"OnRun"。
4. 在CAutoProjectApp::InitInstance() 函数中添加如下代码,以实现加载和初始化COM接口:
BOOL CAutoProjectApp::InitInstance()
{
if(!AfxOleInit()) // 添加的代码由此开始
{
AfxMessageBox("Could not initialize COM dll");
return FALSE;
} // 添加结束 AfxEnableControlContainer();
… …
}
5. 在AutoProjectDlg.cpp文件的头部添加如下语句:
#include "MsWord8.h"
6. 在CAutoProjectDlg::OnRun()中添加Office自动化代码,如下: void CAutoProjectDlg::OnRun()
{
_Application oWordApp; // oWordApp is the Word _Application object // Start Word and get Application object...
if(!oWordApp.CreateDispatch("Word.Application"))
{
AfxMessageBox("Couldn't start Word.");
}
else
{
//Make Word Visible and display a message
oWordApp.SetVisible(TRUE);
AfxMessageBox ("Word is Running!");
}
}
7. Build并运行这个工程。运行结果:当点击Run按钮时,Microsoft Word将被启动。
系统有没有注册Office的组件,可以在OLE/COM Object Viewer里面或是直接在注册表里面找找看。注册表里面可以看看有没有注册Word.Application对象。
{
BeginWaitCursor();
CEmbed_WordCntrItem* pItem = NULL;
TRY
{
CEmbed_WordDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pItem = new CEmbed_WordCntrItem(pDoc);
ASSERT_VALID(pItem);
GetClientRect(&pItem->rect);
CLSID clsid;
if(FAILED(::CLSIDFromProgID(L"Word.document",&clsid)))
AfxThrowMemoryException();
if(!pItem->CreateNewItem(clsid))
AfxThrowMemoryException();
ASSERT_VALID(pItem);
pItem->DoVerb(OLEIVERB_SHOW, this);
m_pSelection = pItem;
pDoc->UpdateAllViews(NULL);
LPDISPATCH lpDisp;
lpDisp = pItem->GetIDispatch();
}
CATCH(CException, e)
{
if (pItem != NULL)
{
ASSERT_VALID(pItem);
pItem->Delete();
}
AfxMessageBox(IDP_FAILED_TO_CREATE);
}
END_CATCH
EndWaitCursor(); }以上程序执行到 CreateNewItem() 时失败报错:建立对象失败。请确认该对象已被注册入系统
求教各位?
我照了这个例子(http://www.chinaoak.com/download/material/techtips/vc-learn/VC/MFC-WORD.htm)做了之后出现了一个问题,就是在onDraw函数中调用OnGetItemPosition时提示出保护成员无法调用,如果不修改onDraw的话出来的程序word在客户区占的地方又很小,打出的字也很小。
1:找一台能CreateNewItem()的机子,把它上面的OLE*.*全拷到我的%systemroot%\new flod\下
2:进入命令行修复模式,用拷过来的OLE*.*覆盖%systemroot%\下的OLE*.*.
3: 试了试没起作用,接着修复安装Win2k Professional.
4: 卸载Office2k.
5: 重装Office2k.最好把第5步提前。我这样做后的确好了
你可以试试就用VC自动生成的代码(我看过,和qing_li73(bluemoon)给出的链接上的代码差不多),创建一个SDI程序,注意选择“Container”,运行后在编辑里面选择插入新对象里面看看有没有Word文档对象。
或者:
打开你的注册表,打开HKEY_CLASSES_ROOT,看看下面有没有HKEY_CLASSES_ROOT\Word.Application和HKEY_CLASSES_ROOT\Word.Document子项,如果没有,说明你的Word根本就没注册进注册表。根据Word.Document下面的CLSID查看Word的Document对象的CLSID值,再根据这个值查找HKEY_CLASSES_ROOT\CLSID下面有没有关于这个CLSID值的子项,在里面LocalServer32的值可以看到你的Word的路径,看看对不对。再确定在应用程序的初始化里使用了AfxOleInit()函数。如果这些都没错的话而你的程序还是不能运行的话,那就我也不知道了!^_^
他会自动~~~
打开office目录下的msword9.olb,全选其中的类。2、用你的程序调用word :
按照MSDN Q221992 的步骤在你和程序中加入宏(以OnInitialUpdate()为基准函数),在调用宏的地方输入
Set obj=CreateObject("word.application")
obj.visible=true
msgbox("ok")
Set Obj=nothing
不难的,解决问题的思路很死:
------------------
在Office应用程序中,菜单和工具栏被合成在一个可编程的名为CommandBars的集合中。作为一种通用的可编程对象,CommandBars可以成为任何的Office应用程序对象模型的一部分,CommandBars所掩盖的是一种统一的编程机制,该机制使得单个的工具栏和菜单项可以被添加到相应的应用程序中。每一个CommandBars集合都是有不同的CommandBar Objects组成;每一个CommandBars Object 有又不同的称为CommandBarControls的对象组成!
CommadBarControls 所表示的是由不同的对象和子对象构成的复杂的架构,进而用这些对象和子对象组成一个单独的对象模型。一个CommandBarControl 本身包含一个CommandBar 对象(可以访问插件中的该对象的属性)。因此,最终使得每一个处于CommandBarControls 集合中CommandBarControl 对象既可以是一个CommandBarComoboBox(Toolbar combobox),也可以是一个CommandBarButton(Toolbar button),抑或是一个CommandBarPopup(Popup menu).我渴望能绘出一个清晰的表示对象关系的示意图,但是我确实不擅长绘图(说心里话),当然了,我也确信这样的关系图在msdn中关于如何描述MS Office CommandBars的章节中有清晰地说明!
希望达到的目的是在自己工程中的一个View中嵌入Word的编辑窗口,并在工具条上
嵌入一些Word的基本功能按钮。遇到的问题是:使用了msdn 和csdn上类似的例子Embed_Word,结果是在OleCreate时失败,返回的错误是“内存不足”,但嵌入Excel,Winpad等都能成功重装了Win2000,Office2000后问题仍然存在,但在其他同样配置的机器上,用相同的光盘安装了Win2000,Office2000后有的机器上可以成功,有的不行。上诉问题让我非常困惑,仔细核对了注册表等项目都没有问题。
问题无法解决的情况下,转而寻求其它解决方法,ajiva(编程菜鸟小旋风 办事不到一分钟) 高手提供的在CHtmlView中打开word
文档解决了一部分问题(即:将word编辑界面嵌入了View中),但工具条仍然没有嵌入。现在求助各位高手一个完整的解决方案,谢谢!
能不能麻烦你,方便的话把word8.olb这个文件发给我啊!
[email protected]
~~
你可以参考一下,或者我告诉你。
my e-mail: [email protected]
[email protected] 谢谢
小弟看了你的程序很久,还是不太明白,麻烦高手指点一下。最好有点例子,实在不好意思,打扰了,非常感谢!