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

贴上主要代码:

 #include "stdafx.h"
#include "resource.h" // For Visual Studio 2003
#import "VGCoreAuto.tlb" \
rename("GetCommandLine", "VGGetCommandLine") \
rename("CopyFile", "VGCore") \
rename("FindWindow", "VGFindWindow") // For Visual Studio 2005
/*
#import "libid:95E23C91-BC5A-49F3-8CD1-1FC515597048" version("d.0") \
rename("GetCommandLine", "VGGetCommandLine") \
rename("CopyFile", "VGCore") \
rename("FindWindow", "VGFindWindow")
*/ static HINSTANCE g_hResource = NULL; BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
if(fdwReason == DLL_PROCESS_ATTACH)
{
g_hResource = (HINSTANCE)hinstDLL;
}
return TRUE;
} class CWelcomeScreenPlugin : public VGCore::IVGAppPlugin
{
private:
VGCore::IVGApplication *m_pApp;
volatile ULONG m_ulRefCount;
long m_lCookie; static INT_PTR CALLBACK DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void OnAppStart(); public:
CWelcomeScreenPlugin(); // IUnknown
public:
STDMETHOD(QueryInterface)(REFIID riid, void **ppvObject);
STDMETHOD_(ULONG, AddRef)(void) { return ++m_ulRefCount; }
STDMETHOD_(ULONG, Release)(void)
{
ULONG ulCount = --m_ulRefCount;
if(ulCount == )
{
delete this;
}
return ulCount;
} // IDispatch
public:
STDMETHOD(GetTypeInfoCount)(UINT *pctinfo) { return E_NOTIMPL; }
STDMETHOD(GetTypeInfo)(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo) { return E_NOTIMPL; }
STDMETHOD(GetIDsOfNames)(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) { return E_NOTIMPL; }
STDMETHOD(Invoke)(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr); // IVGAppPlugin
public:
STDMETHOD(raw_OnLoad)(VGCore::IVGApplication *Application);
STDMETHOD(raw_StartSession)();
STDMETHOD(raw_StopSession)();
STDMETHOD(raw_OnUnload)();
}; CWelcomeScreenPlugin::CWelcomeScreenPlugin()
{
m_pApp = NULL;
m_lCookie = ;
m_ulRefCount = ;
} STDMETHODIMP CWelcomeScreenPlugin::QueryInterface(REFIID riid, void **ppvObject)
{
HRESULT hr = S_OK;
m_ulRefCount++;
if(riid == IID_IUnknown)
{
*ppvObject = (IUnknown *)this;
}
else if(riid == IID_IDispatch)
{
*ppvObject = (IDispatch *)this;
}
else if(riid == __uuidof(VGCore::IVGAppPlugin))
{
*ppvObject = (VGCore::IVGAppPlugin *)this;
}
else
{
m_ulRefCount--;
hr = E_NOINTERFACE;
}
return hr;
} STDMETHODIMP CWelcomeScreenPlugin::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{
switch(dispIdMember)
{
case 0x0012: //DISPID_APP_START
OnAppStart();
break;
}
return S_OK;
} STDMETHODIMP CWelcomeScreenPlugin::raw_OnLoad(VGCore::IVGApplication *Application)
{
m_pApp = Application;
if(m_pApp)
{
m_pApp->AddRef();
}
return S_OK;
} STDMETHODIMP CWelcomeScreenPlugin::raw_StartSession()
{
try
{
m_lCookie = m_pApp->AdviseEvents(this);
}
catch(_com_error &e)
{
MessageBox(NULL, e.Description(), "Error", MB_ICONSTOP);
}
return S_OK;
} STDMETHODIMP CWelcomeScreenPlugin::raw_StopSession()
{
try
{
m_pApp->UnadviseEvents(m_lCookie);
}
catch(_com_error &e)
{
MessageBox(NULL, e.Description(), "Error", MB_ICONSTOP);
}
return S_OK;
} STDMETHODIMP CWelcomeScreenPlugin::raw_OnUnload()
{
if(m_pApp)
{
m_pApp->Release();
m_pApp = NULL;
}
return S_OK;
} void CWelcomeScreenPlugin::OnAppStart()
{
try
{
m_pApp->StartupMode = VGCore::cdrStartupDoNothing;
// To avoid 64 bit portability warning, store the long handle value into an INT_PTR
// before casting it to HWND:
INT_PTR nHandle = m_pApp->AppWindow->Handle;
HWND hAppWnd = reinterpret_cast<HWND>(nHandle);
INT_PTR nRet = DialogBoxParam(g_hResource, MAKEINTRESOURCE(IDD_WELCOME), hAppWnd, DlgProc, (LPARAM)this);
switch(nRet)
{
case IDC_NEWDOC:
m_pApp->CreateDocument();
break; case IDC_LASTDOC:
if(m_pApp->RecentFiles->Count > )
{
m_pApp->OpenDocument(m_pApp->RecentFiles->Item[]->FullName, );
}
else
{
MessageBox(NULL, "No documents were editied yet.", "Error", MB_ICONSTOP);
}
break;
}
}
catch(_com_error &e)
{
MessageBox(NULL, e.Description(), "Error", MB_ICONSTOP);
}
} INT_PTR CALLBACK CWelcomeScreenPlugin::DlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
if(uMsg == WM_COMMAND)
{
switch(LOWORD(wParam))
{
case IDC_NEWDOC:
EndDialog(hDlg, IDC_NEWDOC);
break; case IDC_LASTDOC:
EndDialog(hDlg, IDC_LASTDOC);
break; case IDOK:
case IDCANCEL:
EndDialog(hDlg, );
break;
}
}
else if(uMsg == WM_INITDIALOG)
{
return ;
}
return ;
} extern "C" __declspec(dllexport) DWORD APIENTRY AttachPlugin(VGCore::IVGAppPlugin **ppIPlugin)
{
*ppIPlugin = new CWelcomeScreenPlugin;
return 0x100;
}

下载:

WelcomeScreen_Src.zip
WelcomeScreen_cpg.zip

												

C++ 编写 CorelDRAW CPG 插件例子(1)—WelcomeScreen的更多相关文章

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

    这是另一个例子: 贴上主要代码: #include "stdafx.h" #include <tchar.h> #import "libid:95E23C91 ...

  2. 【jQuery基础学习】08 编写自定义jQuery插件

    目的:虽然jQuery各种各样的功能已经很完善了,但是我们还是要学会自己去编写插件.这样我们可以去封装一些项目中经常用到的专属的代码,以便后期维护和提高开发效率. jQuery插件的类型: 封装对象方 ...

  3. 自己编写Android Studio插件 别停留在用的程度了(转载)

    转自:自己编写Android Studio插件 别停留在用的程度了 1概述 相信大家在使用Android Studio的时候,或多或少的会使用一些插件,适当的配合插件可以帮助我们提升一定的开发效率,更 ...

  4. 用jquery编写的分页插件

    用jquery编写的分页插件 源码 function _pager_go(total_page) { var page_str = $("#_pager_textbox").val ...

  5. 用jquery编写的tab插件

    用jquery编写的tab插件 源码 $.fn.ss_tab = function (options) { var box = $(this); var btns = $(this).find(&qu ...

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

    接着如何自己编写一个easyui插件继续分享一下如何从上一节写的“hello”插件继承出一个“hello2”. 参考了combobox的源码中继承combo,当然我这个简单很多了.都是根据自己的理解来 ...

  7. 用Javascript编写Chrome浏览器插件

    原文:http://homepage.yesky.com/62/11206062.shtml 用Javascript编写Chrome浏览器插件 2010-04-12 07:30 来源:天极网软件频道 ...

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

                                                        批处理bat脚本编写(附详细例子) 由于在项目开发的过程中经常需要编写bat脚本,而看大牛们编写 ...

  9. 如何编写一个gulp插件

    很久以前,我们在"细说gulp"随笔中,以压缩JavaScript为例,详细地讲解了如何利用gulp来完成前端自动化. 再来短暂回顾下,当时除了借助gulp之外,我们还利用了第三方 ...

随机推荐

  1. web2.0、互联网+、IT时代与DT时代、工业4.0 引发的思考

    最近忙着找实习,来学校一个星期还没到,就感觉已经经历了几个春秋. 第一个实习面试是个杭州互联网小公司,面WEB前端开发实习,怪我一个暑假两个月一点书都没碰,偏偏赶上G20到9/9才开学,没啥准备就一头 ...

  2. 关于相对路径和绝对路径及cd命令的使用

    cd (change directory) 目录    跳转到指定目录下 路径定义分为两种:绝对路径(absolute)和相对路径(relative) 绝对路径:从根目录(/)开始写去的文件名或目录名 ...

  3. https抓包判断证书问题

    openssl s_client -connect 61.135.250.130:443这个是reg.163.com的 tcpdump 也可

  4. poj1472[模拟题]

    Instant Complexity Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2017   Accepted: 698 ...

  5. PS基础学习 1---基本工具

    1,选框工具: 选择以后对选框中的内容进行修改 ① Shift + 选框 为正方形 ② 选中后鼠标放在选框中对选择范围进行拖动 ③ 移动工具可以拉着选框中的内容移动 ④ ctrl+D取消选框 ⑤单行选 ...

  6. 获取登录的IP或者信息

    这是转载的,也不想去检查性能,对于这些成熟的代码,发在这里完全是懒,仅此而已! 1.获取客户端IP /// <summary> /// 获取客户端Ip /// </summary&g ...

  7. IIS部署网站局域网内无法访问

    今天在局域网发布一个网站时遇到了个问题,在本机上可以访问,但局域网内其他机子访问此IP地址时无法显示,这个问题以前也遇到过,现在总结一下处理方法 检查两个方面: IIS网站身份验证 在IIS中选择要发 ...

  8. 【转】Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline

    相信大家对LinearLayout已经相当熟悉,但你们是否了解它的属性baselineAligned呢? Android官方文档是这么描述的:

  9. 和阿文一起学H5——音乐素材

    国内 1.网易云音乐 http://music.163.com/ 网易云音乐有听歌识曲功能,听几秒中可听出是什么歌. 微信摇一摇也有听歌识曲功能. 2.只要伴奏不要人声 http://5sing.ku ...

  10. 修改msconfig->引导->高级选项-》最大内存为512M

    本来想开机提速的!手贱  把 最大内存设置成了512M  结果开机悲剧了,启用了微软的自动修复也不能解决问题!最后是WIN7 PE系统下直接修复boot结果了.遇到这种问题的朋友们可以试试喔