青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

開發OFFICE插件總結

前段時間做了個關于PPT的插件開發,簡單總結一下。

1. VC6.0中使用VBA
    在VC6.0中,可以使用導入類型庫功能,即可連接到所需的OLB文件,并且可以選擇導入的類。然后可以直接聲明對象,如_Application m_app。需要注意的是,導入的類只能是實體類,包含虛函數的類都無法包含進來。

2. VS2005中使用VBA
    VS2005中,由于沒有導入類型庫功能,可以使用VC6.0中生成的.H文件,并連接到OLB文件。使用方法和VC6.0中基本相同。

3. VS2005中開發插件
    VS2005中,可以直接利用Project Wizard來開發OFFICE插件程序。
    生成的程序框架包含Connect.h,Connect.cpp,類CConnect中包含插件的加載事件處理函數。
    需要導入文件:
1 #import "mso9.dll" rename_namespace("Office") \
2 rename("RGB","OfficeRGB") \
3 rename("DocumentProperties","OfficeDocumentProperties")
4 using namespace Office;
5 #import "VBE6EXT.olb" rename_namespace("VBE6")
6 using namespace VBE6;
7 #import "MSPPT9.OLB" named_guids,rename_namespace("MSPPT") \
8 rename("RGB","PPTRGB")
9 using namespace MSPPT;
    VBA對象的使用和前兩點有些不同,例如:
1 CComPtr<IDispatch> m_pApplication;
2 pApplication->QueryInterface(__uuidof(IDispatch), (LPVOID*)&m_pApplication);
3 MSPPT::_ApplicationPtr pApp;
4 m_pApplication->QueryInterface(__uuidof(MSPPT::_ApplicationPtr),(LPVOID*)&pApp);
    該調用方法缺點是調用比較麻煩,但是優點是可以使用虛函數。例如_Application類中的get_HWND方法。
 
4. VS2005中開發插件-事件的加入
   
PPT中的提供的事件及注冊消息號如下表(詳細請參見MSDN文章How to handle PowerPoint 2000 events or PowerPoint 2002 events by using Visual C++ .NET 2002 or Visual C++ .NET 2003 and Microsoft Foundation Classes):
DISPID Method Name PowerPoint 2002 Only
2001 WindowSelectionChange  
2002 WindowBeforeRightClick  
2003 WindowBeforeDoubleClick  
2004 PresentationClose  
2005 PresentationSave  
2006 PresentationOpen  
2007 NewPresentation  
2008 PresentationNewSlide  
2009 WindowActivate  
2010 WindowDeactivate  
2011 SlideShowBegin  
2012 SlideShowNextBuild  
2013 SlideShowNextSlide  
2014 SlideShowEnd  
2015 PresentationPrint  
2016 SlideSelectionChanged x
2017 ColorSchemeChanged x
2018 PresentationBeforeSave x
2019 SlideShowNextClick x

    首先在OnConnection函數中連接到事件源(establish a connection with the event source represented by pUnk),如下:
1 pApplication->QueryInterface(__uuidof(IDispatch), (LPVOID*)&m_pApplication);
2 pAddInInst->QueryInterface(__uuidof(IDispatch), (LPVOID*)&m_pAddInInstance);
3 EApplicationEvents::DispEventAdvise(m_pApplication);
    同樣,OnDisconnection中斷開事件的連接:
1 EApplicationEvents::DispEventUnadvise(m_pApplication)
    注冊事件函數,以PRESENTATIONOPEN事件為例,Connect.h中的代碼如下:
 1 _ATL_FUNC_INFO OnPresentationOpenInfo ={CC_STDCALL,VT_EMPTY,1,VT_DISPATCH};
 2 #define PPTADDIN_PRESENTATIONOPEN        2006
 3 class ATL_NO_VTABLE CConnect : 
 4     public CComObjectRootEx<CComSingleThreadModel>,
 5     public CComCoClass<CConnect, &CLSID_Connect>,
 6     public IDispatchImpl<AddInDesignerObjects::_IDTExtensibility2, &AddInDesignerObjects::IID__IDTExtensibility2, &AddInDesignerObjects::LIBID_AddInDesignerObjects, 10>,
 7     public IDispEventSimpleImpl<1,CConnect,&__uuidof(MSPPT::EApplication)>
 8 {
 9 public:
10     typedef IDispEventSimpleImpl<1,CConnect,&__uuidof(MSPPT::EApplication)> EApplicationEvents;
11     CConnect()
12     {
13     }
14 
15 DECLARE_REGISTRY_RESOURCEID(IDR_ADDIN)
16 DECLARE_NOT_AGGREGATABLE(CConnect)
17 
18 BEGIN_COM_MAP(CConnect)
19     COM_INTERFACE_ENTRY(IDispatch)
20     COM_INTERFACE_ENTRY(AddInDesignerObjects::IDTExtensibility2)
21 END_COM_MAP()
22 
23 BEGIN_SINK_MAP(CConnect)
24     SINK_ENTRY_INFO(1, __uuidof(MSPPT::EApplication),/*dispid*/ 2006, OnPresentationOpen, &OnPresentationOpenInfo)
25     
26 END_SINK_MAP()
27 
28     DECLARE_PROTECT_FINAL_CONSTRUCT()
29 
30     HRESULT FinalConstruct()
31     {
32         return S_OK;
33     }
34 
35     void FinalRelease() 
36     {
37     }
38 
39 public:
40     //IDTExtensibility2 implementation:
41     STDMETHOD(OnConnection)(IDispatch * Application, AddInDesignerObjects::ext_ConnectMode ConnectMode, IDispatch *AddInInst, SAFEARRAY **custom);
42     STDMETHOD(OnDisconnection)(AddInDesignerObjects::ext_DisconnectMode RemoveMode, SAFEARRAY **custom );
43     STDMETHOD(OnAddInsUpdate)(SAFEARRAY **custom );
44     STDMETHOD(OnStartupComplete)(SAFEARRAY **custom );
45     STDMETHOD(OnBeginShutdown)(SAFEARRAY **custom );
46 private:
47     CComPtr<IDispatch> m_pApplication;
48     CComPtr<IDispatch> m_pAddInInstance;
49 
50 protected:
51     typedef IDispEventSimpleImpl</*nID =*/ 1,CConnect, &__uuidof(MSPPT::EApplication)> ApplicationEvents;
52     void __stdcall OnPresentationOpen(IDispatch * pres);
53 };

    Connect.cpp中添加OnPresentationOpen的源代碼。
    需要注意的是OnPresentationOpen函數的調用方式是__stdcall,否則編譯會出錯。




posted on 2007-06-20 17:58 迷宮の未來 閱讀(6849) 評論(3)  編輯 收藏 引用

評論

# re: 開發OFFICE插件總結[未登錄] 2009-02-18 08:58 fancy

不錯,很有參考價值
  回復  更多評論   

# re: 開發OFFICE插件總結 2009-04-09 11:20 David Lee

好文,正好要做個word2003的插件。謝謝山大王了  回復  更多評論   

# re: 開發OFFICE插件總結[未登錄] 2009-09-02 10:56 li

很有價值  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


<2009年9月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

導航

統計

常用鏈接

留言簿(10)

隨筆檔案

文章檔案

最新隨筆

搜索

積分與排名

最新隨筆

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久成人精品免费播放动漫| 久久激情综合网| 一区二区三区 在线观看视频| 欧美高清视频| 亚洲另类在线视频| 亚洲第一综合天堂另类专| 欧美一区二区三区播放老司机| 国产农村妇女精品一区二区| 国产精品毛片va一区二区三区| 久久精品日韩欧美| 久久久久久9| 国产情人综合久久777777| 久久综合九色综合欧美就去吻| 久久久久天天天天| 在线中文字幕不卡| 国产精品大片免费观看| 欧美成熟视频| 亚洲人成高清| 一区二区不卡在线视频 午夜欧美不卡'| 中日韩视频在线观看| 亚洲欧美久久久| 久久久久久亚洲精品不卡4k岛国| 91久久夜色精品国产网站| 亚洲激情另类| 狠狠久久婷婷| 亚洲激情在线视频| 久久久久久久久久久久久女国产乱| 久久久99国产精品免费| 久久手机免费观看| 国产精品欧美日韩一区二区| 国产在线不卡视频| 亚洲影院色无极综合| 蜜桃久久精品乱码一区二区| 亚洲激情视频在线播放| 午夜精品久久久久久 | 欧美另类变人与禽xxxxx| 国产精品美女一区二区| 91久久黄色| 久久精品盗摄| 日韩天堂在线观看| 欧美电影在线观看| 国产一区二区三区av电影| 久久一区亚洲| 中文亚洲字幕| 一区二区三区精品视频在线观看 | 欧美在线免费视屏| 欧美性大战久久久久久久| 午夜精品福利在线| 亚洲人成网站影音先锋播放| 欧美一区二区视频97| 免费观看一区| 亚洲欧美日韩国产另类专区| 午夜精品一区二区三区在线播放 | 国产精品一区在线观看| 亚洲欧美美女| 欧美影院午夜播放| 亚洲在线观看免费视频| 亚洲一区二区三区精品动漫| 久久野战av| 亚洲成人在线视频播放| 猛干欧美女孩| 亚洲电影第1页| 亚洲激情成人| 国产精一区二区三区| 亚洲欧洲在线视频| 国产精品一区毛片| 久久精品视频在线免费观看| 久久婷婷综合激情| 午夜久久久久久| 国产亚洲一区二区三区| 久久国产免费看| 国产精品美女久久久久av超清| 亚洲精品在线视频观看| 亚洲影院一区| 久久精品欧洲| 正在播放欧美一区| 久久人人看视频| 国产一区二区三区精品久久久| 久久中文字幕一区二区三区| 亚洲九九爱视频| 欧美激情欧美狂野欧美精品| 另类激情亚洲| 亚洲老板91色精品久久| 亚洲国产成人精品久久| 欧美成人一品| 国产精品日韩欧美一区| 亚洲男女毛片无遮挡| 亚洲欧美日韩精品久久| 欧美国产成人精品| 亚洲理论在线| 亚洲丝袜av一区| 一区二区三区在线不卡| 亚洲国产日韩欧美在线图片| 亚洲天堂网站在线观看视频| 国产日韩欧美不卡| 欧美国产日韩免费| 国产精品国产三级国产专区53| 在线观看亚洲一区| 亚洲国产精彩中文乱码av在线播放| 亚洲欧美国产高清| 欧美精品综合| 久久精品亚洲热| 欧美成人69| 亚洲欧美日韩在线不卡| 久久婷婷人人澡人人喊人人爽 | 日韩视频在线一区| 一区二区久久久久久| 激情久久综合| 亚洲一区二区欧美| 国产精品免费视频观看| 欧美大片第1页| 国产精品久久夜| 亚洲国产成人在线| 激情久久一区| 亚洲天堂av在线免费观看| 亚洲国产精品成人va在线观看| 久久夜色精品国产| 欧美日韩午夜剧场| 欧美激情精品久久久久久久变态| 久久久噜噜噜久久| 亚洲专区欧美专区| 欧美精品一区二区在线播放| 久久综合久久88| 国产精品五月天| 一区二区三区四区国产| 韩日欧美一区二区三区| 欧美午夜在线| 欧美亚洲三区| 欧美欧美午夜aⅴ在线观看| 久久久久久久久岛国免费| 久久国产婷婷国产香蕉| 亚洲一区在线视频| 午夜在线不卡| 欧美亚洲免费高清在线观看| 欧美日韩亚洲高清| 亚洲精品网站在线播放gif| 亚洲国产精品va在看黑人| 欧美韩日一区二区| 欧美精品三级在线观看| 欧美国产精品一区| 亚洲欧洲一区| 欧美电影免费观看网站| 欧美激情一区二区在线 | 久久久久88色偷偷免费| 午夜在线成人av| 久久亚洲精品伦理| 久久这里有精品视频| 韩日欧美一区二区| 久久久久久久高潮| 亚洲视频免费看| 欧美色欧美亚洲另类二区 | 一区在线视频| 久久永久免费| 亚洲午夜在线视频| 国产精品家教| 久久视频在线视频| 欧美国产日韩亚洲一区| 一区二区三区免费看| 国产精品久久久久久久久婷婷| 理论片一区二区在线| 欧美大片免费观看| 欧美激情一区二区久久久| 一区二区三区四区五区精品视频| 久久成人综合视频| 欧美韩国一区| 午夜精品成人在线视频| 国内激情久久| 欧美日韩国产综合视频在线观看中文| 久久久久久夜| 亚洲精品乱码久久久久久蜜桃91 | 欧美大片免费看| 一本色道久久加勒比88综合| 国产精品videosex极品| 亚洲精品极品| 欧美一区二区免费| 亚洲国产精品精华液2区45| 欧美另类高清视频在线| 欧美国产日产韩国视频| 国产在线观看一区| 制服丝袜亚洲播放| 鲁大师影院一区二区三区| 国产一区二区三区精品久久久 | 亚洲午夜一区二区| 亚洲精品乱码久久久久| 国产日韩欧美在线播放| 99国产精品久久久久久久久久 | 亚洲美女尤物影院| 欧美在线免费观看| 亚洲精品一区在线| 激情欧美一区二区三区| 欧美日韩综合视频| 老色批av在线精品| 亚洲一区视频在线| 亚洲乱码精品一二三四区日韩在线 | 久久在线视频| 国内精品久久久久久影视8| 欧美高清视频www夜色资源网| 欧美激情一区二区久久久| 最新国产精品拍自在线播放| 久久天天狠狠|