vc++用com接口调用office word,如何获得application的commandbars对象

talentdegc 2016-01-18 02:15:08
在网上找到一个c#程序,可以调用word里面的画图工具,想用vc++实现一次,不会用VC++去初始化commandbars对象,求大神们帮忙~~~~~~~~~~~~~~
...全文
1388 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-07-03
  • 打赏
  • 举报
回复
在Word2003中开始记录宏,手动完成所需功能,结束记录宏,按Alt+F11键,查看刚才记录的宏对应的VBA代码。
赵4老师 2017-07-03
  • 打赏
  • 举报
回复
仅供参考:
//1.在VC中新建一控制台程序,选支持MFC(当然,你也可以不选择支持MFC的,不过会很麻烦)
//2.按CTRL+W调出MFC ClassWizard,Add Class->From a type library,选择你的word的类型库
//  (例如我的是word2003,安装在e盘,我的路径是"e:\edittools\microsoft office\office11\msword.olb"),
//  选择完毕后,在弹出的窗口中选择要让classwizard生成的包装类,在本例中要用到
//  _Application,
//  Documents,
//  _Document,
//  Range
//  这四个类,选中他们后按OK
//3.进入你的main函数所在的cpp文件,加入头文件引用
//  #include  "msword.h"    //引用刚才classwizard生成的idispatch包装类
//4.加入代码
// console_word.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "console_word.h"
#include "msword.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    int nRetCode = 0;

    // initialize MFC and print and error on failure
    if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    {
        // TODO: change error code to suit your needs
        printf(_T("Fatal Error: MFC initialization failed!\n"));
        nRetCode = 1;
    }
    else
    {
        // TODO: code your application's behavior here.
        if  (CoInitialize(NULL)  !=  S_OK)
        {
            AfxMessageBox("初始化COM支持库失败!");
            return  -1;
        }

        _Application  wordApp;
        Documents     docs;
        _Document     doc;
        Range         aRange;
        COleVariant   vTrue((short)TRUE), vFalse((short)FALSE), vOpt((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
        CString       txt;

        wordApp.CreateDispatch("Word.Application",NULL);
        wordApp.SetVisible(FALSE);
            docs=wordApp.GetDocuments();
                doc=docs.Open(COleVariant("c:\\new\\测试.doc"),vFalse,vTrue,vFalse,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt,vOpt);
                    aRange=doc.Range(vOpt,vOpt);
                        txt=aRange.GetText();
                        AfxMessageBox(txt);//这里GetText得到的就是word文件的纯文本了,你可以将其写到txt文件中
                        printf("[%s]\n",txt.GetBuffer(txt.GetLength()));//里面的换行不是\r\n而是\r,所以需要输出重定向到文本文件看结果。
                    aRange.ReleaseDispatch();
                doc.Close(vOpt,vOpt,vOpt);
                doc.ReleaseDispatch();
            docs.ReleaseDispatch();
        wordApp.Quit(vOpt,vOpt,vOpt);
        wordApp.ReleaseDispatch();

        CoUninitialize();
    }

    return nRetCode;
}


古城孤客 2017-07-01
  • 打赏
  • 举报
回复
CCommandBars bar(word.m_pApplication.GetCommandBars()); int nCount = bar.get_Count(); CString str; str.Format("%d",nCount); MessageBox(str); 哪里有CCommandBars ?
talentdegc 2016-02-23
  • 打赏
  • 举报
回复
自己顶下,raw_executemso的返回值一直都是E_OUTOFMEMORY
talentdegc 2016-01-20
  • 打赏
  • 举报
回复
顶一下,看见的帮我分析下
talentdegc 2016-01-20
  • 打赏
  • 举报
回复
引用 10楼许文君 的回复:

CCommandBars bar(word.m_pApplication.GetCommandBars());
	int nCount = bar.get_Count();
	CString str;
	str.Format("%d",nCount);
	MessageBox(str);
结果176个,至于单独某个怎么使用,可以看接口
我的用get_count方法里面得到的是183,我是想用里面的ExecuteMso这个方法,但总是报错
许文君 2016-01-20
  • 打赏
  • 举报
回复

CCommandBars bar(word.m_pApplication.GetCommandBars());
	int nCount = bar.get_Count();
	CString str;
	str.Format("%d",nCount);
	MessageBox(str);
结果176个,至于单独某个怎么使用,可以看接口
许文君 2016-01-20
  • 打赏
  • 举报
回复
引用 8 楼 talentdegc 的回复:
引用 5楼许文君 的回复:
_Application类里通过 LPDISPATCH GetCommandBars();获取,内容固定的图片可以通过插入图片方式,散点图等可以用machart去画,真正用word里画图不怎么常见
现在能编译通过,但调用里面的方法会报错
明白了,实质上你提问的不对,你应该问哪儿得到commandbars这个包装类及接口,从microsoft office xx.0 object library这个里得到。
talentdegc 2016-01-19
  • 打赏
  • 举报
回复
引用 4楼zgl7903 的回复:
_CommandBarsPtr pCmdbars = pApp->CommandBars; ??
提示_commandbarsptr未声明标识符
talentdegc 2016-01-19
  • 打赏
  • 举报
回复
引用 5楼许文君 的回复:
_Application类里通过 LPDISPATCH GetCommandBars();获取,内容固定的图片可以通过插入图片方式,散点图等可以用machart去画,真正用word里画图不怎么常见
_application,里面的getcommandbars方法,不能获得commandbars对象,我想用commandbars里面的方法 ~~
许文君 2016-01-19
  • 打赏
  • 举报
回复
_Application类里通过 LPDISPATCH GetCommandBars();获取,内容固定的图片可以通过插入图片方式,散点图等可以用machart去画,真正用word里画图不怎么常见
zgl7903 2016-01-19
  • 打赏
  • 举报
回复
_CommandBarsPtr pCmdbars = pApp->CommandBars; ??
talentdegc 2016-01-19
  • 打赏
  • 举报
回复
引用 5楼许文君 的回复:
_Application类里通过 LPDISPATCH GetCommandBars();获取,内容固定的图片可以通过插入图片方式,散点图等可以用machart去画,真正用word里画图不怎么常见
现在能编译通过,但调用里面的方法会报错
talentdegc 2016-01-18
  • 打赏
  • 举报
回复
自己顶一下~大神们,我用的office10
talentdegc 2016-01-18
  • 打赏
  • 举报
回复
引用 1楼oyljerry 的回复:
vc中import导入对应的office com组件,然后会自动生成包装类,你就可以调用了
导入以后,没有commandbars对象啊,只有在有的类里面有get_commandbars方法,返回的只是LPDISPATCH
oyljerry 2016-01-18
  • 打赏
  • 举报
回复
vc中import导入对应的office com组件,然后会自动生成包装类,你就可以调用了

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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