中国共享软件联盟's Archiver

vcman 发表于 2009-9-19 23:58

向WORD插入对象?

[i=s] 本帖最后由 vcman 于 2009-9-20 00:03 编辑 [/i]

我做了一个插件程序(WORD加载项DLL),向WORD添加了一个按扭。现在WORD下单击这个按钮,我可以接受消息:
void __stdcall OnBottonClick(IDispatch * /*Office::_CommandBarButton**/ Ctrl,
       VARIANT_BOOL * CancelDefault)
{
  USES_CONVERSION;
  CComQIPtr<Office::_CommandBarButton> pCommandBarButton(Ctrl);
  
  if(m_spApp == NULL) return;
  //获得当前活动文档
  CComQIPtr <Word::_Document> activedoc;
  if(m_spApp->get_ActiveDocument(&activedoc) != S_OK) return;
  
}
我写到这里了,然后不会了。执行 activedoc-〉Close(); 发现WORD中的当前文档被关闭,看来有点快到目的地了。
现在我要做的是,让WORD插入一个对象,并进入编辑状态,就象按插入公式按钮后打开公式编辑器那样。这个对象程序是我做的(有自己的对象名和GUID)。如何实现?

vcman 发表于 2009-9-20 00:52

顶一下,加急!

vcman 发表于 2009-9-20 02:20

WORD下录制的宏:

    Selection.InlineShapes.AddOLEObject ClassType:="GraphicsPad.Document", _
        FileName:="", LinkToFile:=False, DisplayAsIcon:=False

现在我可以得到 Word::Shapes 指针:

                //获得当前活动文档
                CComQIPtr <Word::_Document> activedoc;
                if(m_spApp->get_ActiveDocument(&activedoc) != S_OK) return;

                CComQIPtr <Word::Shapes> docshapes;
                if(activedoc->get_Shapes(&docshapes) != S_OK) return;

然后调用失败:
          CComVariant   ClassType(_T("GraphicsPad.Document"));   
          CComVariant   FileName(_T(""));   
          CComVariant   LinkToFile(FALSE);   
          CComVariant   DisplayAsIcon(FALSE);   
          CComVariant   IconFileName(_T(""));   
          CComVariant   IconIndex(1);   
          CComVariant   IconLabel(_T(""));   

          CComQIPtr <Word::Shape> wordshape;
          docshapes->AddOLEObject(&ClassType,&FileName,&LinkToFile,&DisplayAsIcon,
                                        &IconFileName,&IconIndex,&IconLabel,0,0,0,0,0,&wordshape);

错在哪里? 怎么调用?

5bxb 发表于 2009-9-20 13:44

问题过于专业,并且要完成这个问题要做的事业比较多
所以除非遇到同样也做这个的人,否则没有人答复的
而同样做这个的人,他们希望你这个竞争对手晚一点加入竞争行列,所以嘛,嘿嘿。

vcman 发表于 2009-9-20 15:14

叫我晚一点加入竞争? 嘿嘿,解决了,立即加入竞争!
void __stdcall OnBottonClick(IDispatch * /*Office::_CommandBarButton**/ Ctrl,
                        VARIANT_BOOL * CancelDefault)
{
        //USES_CONVERSION;
        //CComQIPtr<Office::_CommandBarButton> pCommandBarButton(Ctrl);
       
        if(m_spApp == NULL) return;

        //获得当前活动文档
        CComQIPtr <Word::_Document> activedoc;
        if(m_spApp->get_ActiveDocument(&activedoc) != S_OK) return;

        CComQIPtr <Word::InlineShapes> docshapes;
        if(activedoc->get_InlineShapes(&docshapes) != S_OK) return;  

        VARIANT           clstype; clstype.vt = VT_BSTR;  
        clstype.bstrVal = ::SysAllocString(L"GraphicsPad.Document");

        Word::InlineShape * pNewShape = NULL;
        docshapes->AddOLEObject(&clstype,NULL,FALSE,FALSE,NULL,0,NULL,NULL,&pNewShape);

        ::SysFreeString(clstype.bstrVal);
}

player1 发表于 2009-9-20 16:48

[i=s] 本帖最后由 player1 于 2009-9-20 16:49 编辑 [/i]

[quote]问题过于专业,并且要完成这个问题要做的事业比较多
所以除非遇到同样也做这个的人,否则没有人答复的
而同样做这个的人,他们希望你这个竞争对手晚一点加入竞争行列,所以嘛,嘿嘿。 ...
[size=2][color=#999999]5bxb 发表于 2009-9-20 13:44[/color] [url=http://www.cnsw.org/bbs/redirect.php?goto=findpost&pid=505947&ptid=93326][img]http://www.cnsw.org/bbs/images/common/back.gif[/img][/url][/size][/quote]

确实是这样,不过这是典型的中国式聪明(不是智慧),封闭式发展,作坊,搞不大,没有长远发展,遇有变故就全军断档完蛋,就像中国式学说一样,一代不如一代。

不如学学日本厂家(比如canon和nikon),分进合击,取长补短,共同瓜分外部市场,做大做强made in japan.

vcman 发表于 2009-9-20 22:19

对呀,看我多大方,代码都贴出来了。这些都不是新技术,只是现成的技术没弄明白的问题,挣钱不能挣在这里。这类问题应该互相帮助,共同进步。想必4楼是跟我开玩笑,故意气我,呵呵,很开心......程序运行正常,美刀似乎看得见:lol

兰兰 发表于 2009-9-21 16:01

建议到csdn上问问?那边牛人多.
我的方向和你的不同,要是同行没准能帮你.
问下楼主,插件做好后可以出售吗?

温柔地杀你 发表于 2009-9-21 16:42

其实没有那么多阴暗面,
只是 CNSW 的人很少讨论技术~
即使有技术贴也很少有人回复 :D

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.