C++ 编写 CorelDRAW CPG 插件例子

据我所知,这是国外论坛最早的一个例子,原贴在此:http://forum.oberonplace.com/showthread.php?t=1880&highlight=Plugins

贴上主要代码:

  1 #include "stdafx.h"
  2 #include "resource.h"
  3
  4 // For Visual Studio 2003
  5 #import "VGCoreAuto.tlb"   6             rename("GetCommandLine", "VGGetCommandLine")   7             rename("CopyFile", "VGCore")   8             rename("FindWindow", "VGFindWindow")
  9
 10 // For Visual Studio 2005
 11 /*
 12 #import "libid:95E23C91-BC5A-49F3-8CD1-1FC515597048" version("d.0")  13             rename("GetCommandLine", "VGGetCommandLine")  14             rename("CopyFile", "VGCore")  15             rename("FindWindow", "VGFindWindow")
 16 */
 17
 18 static HINSTANCE g_hResource = NULL;
 19
 20 BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
 21 {
 22   if(fdwReason == DLL_PROCESS_ATTACH)
 23   {
 24     g_hResource = (HINSTANCE)hinstDLL;
 25   }
 26   return TRUE;
 27 }
 28
 29 class CWelcomeScreenPlugin : public VGCore::IVGAppPlugin
 30 {
 31 private:
 32   VGCore::IVGApplication *m_pApp;
 33   volatile ULONG m_ulRefCount;
 34   long m_lCookie;
 35
 36   static INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
 37   void OnAppStart();
 38
 39 public:
 40   CWelcomeScreenPlugin();
 41
 42 // IUnknown
 43 public:
 44   STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject);
 45   STDMETHOD_(ULONG, AddRef)(void) { return ++m_ulRefCount; }
 46   STDMETHOD_(ULONG, Release)(void)
 47   {
 48     ULONG ulCount = --m_ulRefCount;
 49     if(ulCount == 0)
 50     {
 51       delete this;
 52     }
 53     return ulCount;
 54   }
 55
 56 // IDispatch
 57 public:
 58   STDMETHOD(GetTypeInfoCount)(UINT *pctinfo) { return E_NOTIMPL; }
 59   STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) { return E_NOTIMPL; }
 60   STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) { return E_NOTIMPL; }
 61   STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
 62
 63 // IVGAppPlugin
 64 public:
 65   STDMETHOD(raw_OnLoad)(VGCore::IVGApplication *Application);
 66   STDMETHOD(raw_StartSession)();
 67   STDMETHOD(raw_StopSession)();
 68   STDMETHOD(raw_OnUnload)();
 69 };
 70
 71 CWelcomeScreenPlugin::CWelcomeScreenPlugin()
 72 {
 73   m_pApp = NULL;
 74   m_lCookie = 0;
 75   m_ulRefCount = 1;
 76 }
 77
 78 STDMETHODIMP CWelcomeScreenPlugin::QueryInterface(REFIID riid, void **ppvObject)
 79 {
 80   HRESULT hr = S_OK;
 81   m_ulRefCount++;
 82   if(riid == IID_IUnknown)
 83   {
 84     *ppvObject = (IUnknown *)this;
 85   }
 86   else if(riid == IID_IDispatch)
 87   {
 88     *ppvObject = (IDispatch *)this;
 89   }
 90   else if(riid == __uuidof(VGCore::IVGAppPlugin))
 91   {
 92     *ppvObject = (VGCore::IVGAppPlugin *)this;
 93   }
 94   else
 95   {
 96     m_ulRefCount--;
 97     hr = E_NOINTERFACE;
 98   }
 99   return hr;
100 }
101
102 STDMETHODIMP CWelcomeScreenPlugin::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
103 {
104   switch(dispIdMember)
105   {
106     case 0x0012: //DISPID_APP_START
107       OnAppStart();
108       break;
109   }
110   return S_OK;
111 }
112
113 STDMETHODIMP CWelcomeScreenPlugin::raw_OnLoad(VGCore::IVGApplication *Application)
114 {
115   m_pApp = Application;
116   if(m_pApp)
117   {
118     m_pApp->AddRef();
119   }
120   return S_OK;
121 }
122
123 STDMETHODIMP CWelcomeScreenPlugin::raw_StartSession()
124 {
125   try
126   {
127     m_lCookie = m_pApp->AdviseEvents(this);
128   }
129   catch(_com_error &e)
130   {
131     MessageBox(NULL, e.Description(), "Error", MB_ICONSTOP);
132   }
133   return S_OK;
134 }
135
136 STDMETHODIMP CWelcomeScreenPlugin::raw_StopSession()
137 {
138   try
139   {
140     m_pApp->UnadviseEvents(m_lCookie);
141   }
142   catch(_com_error &e)
143   {
144     MessageBox(NULL, e.Description(), "Error", MB_ICONSTOP);
145   }
146   return S_OK;
147 }
148
149 STDMETHODIMP CWelcomeScreenPlugin::raw_OnUnload()
150 {
151   if(m_pApp)
152   {
153     m_pApp->Release();
154     m_pApp = NULL;
155   }
156   return S_OK;
157 }
158
159 void CWelcomeScreenPlugin::OnAppStart()
160 {
161   try
162   {
163     m_pApp->StartupMode = VGCore::cdrStartupDoNothing;
164     // To avoid 64 bit portability warning, store the long handle value into an INT_PTR
165     // before casting it to HWND:
166     INT_PTR nHandle = m_pApp->AppWindow->Handle;
167     HWND hAppWnd = reinterpret_cast<HWND>(nHandle);
168     INT_PTR nRet = DialogBoxParam(g_hResource, MAKEINTRESOURCE(IDD_WELCOME), hAppWnd, DlgProc, (LPARAM)this);
169     switch(nRet)
170     {
171     case IDC_NEWDOC:
172       m_pApp->CreateDocument();
173       break;
174
175     case IDC_LASTDOC:
176       if(m_pApp->RecentFiles->Count > 0)
177       {
178         m_pApp->OpenDocument(m_pApp->RecentFiles->Item[1]->FullName, 0);
179       }
180       else
181       {
182         MessageBox(NULL, "No documents were editied yet.", "Error", MB_ICONSTOP);
183       }
184       break;
185     }
186   }
187   catch(_com_error &e)
188   {
189     MessageBox(NULL, e.Description(), "Error", MB_ICONSTOP);
190   }
191 }
192
193 INT_PTR CALLBACK CWelcomeScreenPlugin::DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
194 {
195   if(uMsg == WM_COMMAND)
196   {
197     switch(LOWORD(wParam))
198     {
199       case IDC_NEWDOC:
200         EndDialog(hDlg, IDC_NEWDOC);
201         break;
202
203       case IDC_LASTDOC:
204         EndDialog(hDlg, IDC_LASTDOC);
205         break;
206
207       case IDOK:
208       case IDCANCEL:
209         EndDialog(hDlg, 0);
210         break;
211     }
212   }
213   else if(uMsg == WM_INITDIALOG)
214   {
215     return 1;
216   }
217   return 0;
218 }
219
220 extern "C" __declspec(dllexport) DWORD APIENTRY AttachPlugin(VGCore::IVGAppPlugin **ppIPlugin)
221 {
222   *ppIPlugin = new CWelcomeScreenPlugin;
223   return 0x100;
224 }
时间: 2024-10-13 02:01:05

C++ 编写 CorelDRAW CPG 插件例子的相关文章

C++ 编写 CorelDRAW CPG 插件例子(2)—ClearFill

这是另一个例子: 贴上主要代码: 1 #include "stdafx.h" 2 #include <tchar.h> 3 4 #import "libid:95E23C91-BC5A-49F3-8CD1-1FC515597048" version("d.0") 5 rename("GetCommandLine", "VGGetCommandLine") 6 rename("CopyF

学会编写Android Studio插件 别停留在用的程度了

本文为原创,授权公众号:hongyangAndroid独家代理原创发布. 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/51548272: 本文出自:[张鸿洋的博客] 一.概述 相信大家在使用Android Studio的时候,或多或少的会使用一些插件,适当的配合插件可以帮助我们提升一定的开发效率,更加快乐.例如: https://github.com/zzz40500/GsonFormat 可以帮助我们从Gson转化为实体

如何编写一个gulp插件

很久以前,我们在"细说gulp"随笔中,以压缩JavaScript为例,详细地讲解了如何利用gulp来完成前端自动化. 再来短暂回顾下,当时除了借助gulp之外,我们还利用了第三方gulp插件”gulp-uglify”,来达到压缩JavaScript文件的目的. 代码如下: 今儿,我们的重点就是,自己也来实现一个gulp插件. 正文 其实,如果只是单纯地想要编写一个gulp插件不难,可以借助through2或者through-gulp来编写(through-gulp是基于through

JQuery编写自己的插件(七)

一:jQuery插件的编写基础1.插件的种类编写插件的目的是给一系列已经方法或函数做一个封装,以便在其他地方重复使用,方便后期维护和提高开发效率.常见的种类有以下三种:封装对象方法的插件 二:编写自己的插件1.封装jQuery对象方法的插件Step1:框架;(    function($) {    $.fn.extend({        ….        });    })(jQuery) 实例:改变背景色 ;( function($) { $.fn.extend({ "color&quo

如何自己编写一个easyui插件续

接着如何自己编写一个easyui插件继续分享一下如何从上一节写的“hello”插件继承出一个“hello2”. 参考了combobox的源码中继承combo,当然我这个简单很多了.都是根据自己的理解来写的,没有参考什么权威资料,欢迎各位看官拍砖. 1. 实现效果 点击这里在线查看增加了一个输入框,sayHello的是输入的名字. 2. 贴代码 (function ($) { function init(target) { $(target).addClass('hello2'); return

批处理bat脚本编写(附详细例子)

                                                    批处理bat脚本编写(附详细例子) 由于在项目开发的过程中经常需要编写bat脚本,而看大牛们编写的bat脚本简直一头雾水,木有办法,作为bat菜鸟的我只有通过最最简单的例子来熟悉bat脚本中的常用命令,由此来开启我的bat脚本学习之路.... 1.常用命令举例 a.创建文件夹:                         md    D:\mybat       //将在D盘下创建一个名为

如何编写一个Maven插件

如何编写一个Maven插件 本文基于eclipse ee. 建立一个maven插件工程: 主要就是让项目能依赖maven-plugin-api: 编写一个Mojo类: /** * 用于输出消息的Mojo * @goal hello */ public class HelloMojo extends AbstractMojo { /** * @parameter expression="${echo.message}" default-value="Hello Maven Wo

从零开始编写一个vue插件

title: 从零开始编写一个vue插件 toc: true date: 2018-12-17 10:54:29 categories: Web tags: vue mathjax 写毕设的时候需要一个mathjax编辑器,因此直接写一个插件试一下. 准备账号 进入npm注册账号 初始化项目 vue init webpack-simple mathjax-toolbar cd mathjax-toolbar npm install 得到的项目内的/src结构如下: src/ ├── assets

从零开始编写IntelliJ IDEA插件

写Java代码的时候,经常会涉及到重复性的操作,这个时候就会想要是有这样一个插件就好了,如果是大家都会遇到的场景,IDE或许已经提供了,再不然也有可能有人编写了相关的插件.要是这个操作是你们的编码环境特有的,那就只能自己写工具了.所以这里来学学如何编写IDEA插件,让自己的编程环境更加强大,更好的进行装逼. 开发环境 开发IDEA插件有以下这些依赖: IntelliJ IDEA Community Edition IntelliJ IDEA Community Edition 源码 Plugin