最近在做个word的电子签章,需要在word上增加个按钮,在网上找了些资料按钮式添上去了。可是怎样能在按钮的处理函数中获得到Application对象或者 ActiveDocument对象 来操作打开的word文件那? 网上有代码:
void __stdcall CMyAddin::OnClickButton1(IDispatch * /*Office::_CommandBarButton**/ Ctrl,VARIANT_BOOL * CancelDefault) 

  CComQIPtr <Office::_CommandBarButton> spBtn1(Ctrl); 
  CComQIPtr <Word::_Application> spApp; 
  CComQIPtr <Word::_Document> spDoc; 
  CComQIPtr <Word::InlineShapes> spInS; 
  ...

是通过参数IDispatch * Ctrl来初始化一个_CommandBarButton对象,然而07的消息处理函数是在
STDMETHOD raw_GetCustomUI)(BSTR RibbonID, BSTR * RibbonXml)返回的XML里指定,该函数大概为
STDMETHODIMP CWordAddin::OnMyButton(IDispatch *pIDispControl);
怎么从pIDispControl得到_Application对象那...?
望高手能指点一二....

解决方案 »

  1.   

    你的思路有点乱。你需要实现三部分:
    1.添加WORD盖章按钮:
    实现方法两个:
    方法1:做WORD模板,里边做好按钮。在要盖章的WORD中加载这个模板。
    方法2:做WORD插件,需要实现OnConnection、OnDisconnection,,等方法,在STDMETHOD(OnConnection)(IDispatch * Application, ext_ConnectMode ConnectMode, IDispatch * AddInInst, SAFEARRAY * * custom){}里得到Application,这样就能操作WORD了。在插件里边实现添加按钮操作。
     缺点:安装后所有WORD文件中都能看到此按钮。2.印章控件:使用ATL写一个控件。3.盖章:
    实现ATL控件。调用微软WORD接口插入控件。
    实例(VB代码):
    'ctrl.SignCtrl为写的ATL控件。 ctrl为控件名,SignCtrl为类名。
    Set sealContainerInline = Application.Selection.InlineShapes.AddOLEControl("ctrl.SignCtrl")
    Set sealContainer = sealContainerInline.ConvertToShape
        With sealContainer
            .LockAnchor = False
            .WrapFormat.AllowOverlap = True
            .WrapFormat.Side = 0
            .WrapFormat.Type = 3
            If iStampPosType = 0 Then   '最底层
                .ZOrder 5
            Else                        '最顶层
                .ZOrder 4
            End If
        End With
      

  2.   

    在word加载com时会执行方法OnConnectionOnConnection 的第一个参数就是 _Application对象指针用一个变量把改指针保存下来供之后用
      

  3.   

    谢了,呵呵,我以前也这样想过。但是没注意到他的OnConnection里在输出个调试信息后直接就返回了,我说怎么一直不成功。刚看又说了这方法,就在OnConnection上单步了一下,才发现诡异的直接跳到了函数的最后....
        还想问下,怎么能在控件中或其他地方保存一些其他信息,比如文件的HASH值。因为在文档上画出个印章只是表面。为了验证,必须嵌入一些其他信息...