首页 » 排名链接 » 如何使用C++开发CDR的CPG插件?(插件如何使用开发类型文件)

如何使用C++开发CDR的CPG插件?(插件如何使用开发类型文件)

萌界大人物 2024-10-24 04:18:44 0

扫一扫用手机浏览

文章目录 [+]

CPG插件是什么

CDR软件提供了插件机制,CPG插件就是其中的一种,另外还有GMS插件以及其他类型的插件。
CPG插件是最高级的一种插件,其自由灵活程度、上手开发难度都比GMS插件要高得多,虽然开发难度较高,但它能够提供更多更强的功能。

基于C++编译的CPG插件,在同等的代码逻辑和处理数据量情况下,CPG插件的运行速度可以远超基于VBA编写的GMS插件。

如何使用C++开发CDR的CPG插件?(插件如何使用开发类型文件) 排名链接
(图片来自网络侵删)

CPG插件的本质其实是DLL,即动态链接库,只不过它的后缀名是 .cpg,由CDR软件来加载读取,在CDR启动时附加到CDR程序中,得到全局CDR应用程序的实例,从而实现扩展功能(即插件功能)。

CDR在启动过程中,会自动加载 Plugins 或者 plugins64 目录下的 cpg 文件(其实就是加载DLL文件)。
在X4版本中,CPG插件的存放目录是 Draw\Plugins,如下图所示:

CPG插件如何开发

由于CPG插件本质上是DLL,所以理论上来说,绝大部分能够编写DLL并编译TLB类型库的开发工具,都可以拿来编写CPG,例如:C++、Delphi 等。

编写CPG插件,需要使用到CDR软件提供的 VGCoreAuto.tlb 这个TLB类型库文件。
对于32位CDR而言,在 CDR安装目录的 Programs 文件夹下面,可以找到 vgcoreauto.tlb文件;对于64位CDR而言,在 CDR安装目录的 Programs64文件夹下面,可以找到 vgcoreauto.tlb文件,如下图所示:

X4版本的TLB类型库

X8版本的TLB类型库

CDR类型库对应的ID是 95e23c91-bc5a-49f3-8cd1-1fc515597048,可以在 C++的源程序文件中头部对其进行导入,参考代码如下:

// 导入CDR类型库,并对有冲突的符号进行重命名(添加 My 前缀)#import "libid:95e23c91-bc5a-49f3-8cd1-1fc515597048" \ rename("GetCommandLine", "MyGetCommandLine") \rename("CopyFile", "MyCopyFile") \rename("FindWindow", "MyFindWindow")

导入后,通过暴露一个 AttachPlugin 函数,即可实现CDR软件和CPG插件之间的“连接”,或者说CPG插件“附加”到了CDR应用程序中。
代码如下所示:

// 暴露AttachPlugin函数,这是CDR调用CPG插件的入口extern "C" __declspec(dllexport) DWORD APIENTRY AttachPlugin(VGCore::IVGAppPlugin CorelDrawPlugin) { MessageBox(NULL, _bstr_t("CDR调用了 AttachPlugin 函数!
"), _bstr_t("CDR插件技术网"), MB_OK); return 0x100;}

使用VS2019基于C++开发CPG插件的步骤

1、在VS 2019中,创建一个DLL类型的工程。

VS2019创建项目界面

选择C++类型的动态链接库项目

在弹出来的项目配置对话框中,按照以下说明来填写。
项目取名为 005-cdr-attach-plugin,你也可以改成自己的,这个名称是题主在学习CPG插件开发时,采用的顺序。
解决方案名称可以改,但最好不要修改,保持和项目同名就好,也不要勾选“将解决方案和项目放在同一目录中”。
保存位置放在F盘的一个文件夹(F:\CPG插件学习\),然后点击创建按钮,等待VS2019生成项目模板,如下图所示:

项目创建成功后,会自动生成一个 dllmain.cpp,这个就是DLL程序的主要程序入口文件,里面的内容已经由 VS 自动生成了一个模板,如下图所示:

在这个自动生成的 dllmain.cpp 中,全选删除,然后粘贴以下代码,就可以得到一个最简单的CPG插件,其功能只是弹出一个消息框,但它确实是本质上的CPG插件。
dllmain.cpp 完整源码如下:

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h" // 导入CDR类型库,并对有冲突的符号进行重命名(添加 My 前缀)#import "libid:95e23c91-bc5a-49f3-8cd1-1fc515597048" \ rename("GetCommandLine", "MyGetCommandLine") \rename("CopyFile", "MyCopyFile") \rename("FindWindow", "MyFindWindow") BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ){ switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; return TRUE;} // 暴露AttachPlugin函数,这是CDR调用CPG插件的入口extern "C" __declspec(dllexport) DWORD APIENTRY AttachPlugin(VGCore::IVGAppPlugin CorelDrawPlugin) { MessageBox(NULL, _bstr_t("CDR调用了 AttachPlugin 函数!
"), _bstr_t("CDR插件技术网"), MB_OK); return 0x100;}

现在请编译代码,生成解决方案。
注意,本工程已配置了目标类型的后缀名是“.cpg”,因此在生成解决方案时,得到的最终文件就是CPG(否则,如果不配置,则默认后缀名是 .dll)。
后缀名配置、以及编译代码生成解决方案的相关截图如下图所示:

CPG插件编译结果

最终得到的CPG插件文件

将生成的CPG插件放在上文所提的插件目录(以X4版本为例),重新启动CDR,即可得到如下所示的运行效果:

复制生成的CPG插件的CDR插件目录

CPG插件运行效果演示

本文小结

在VS2019中新建DLL类型的工程,然后在自动生成的 dllmain.cpp 顶部引入CDR的类型库,通过暴露 AttachPlugin 函数,编译生成CPG文件(DLL文件)。
这便是通过C++编写CPG插件的最小可运行例子(步骤)。

当然,这个CPG插件没什么用,作用就只有一个弹出消息框。
要实现具体的功能,还需要定义一个类,让该类继承自 IVGAppPlugin,从而实现一个自己可控的CPG插件类。

本文仅做参考,部分图片和源码摘自题主的CPG文章专栏,如有不正之处还请指正,我将非常感谢!
感兴趣读者可联系题主获取本文提到的完整工程源码压缩包,这里就不上传了。

标签:

相关文章

崇左区,历史文化与现代发展的交汇点

崇左区,位于中国广西壮族自治区南部,是一个历史悠久、文化底蕴深厚的地区。近年来,崇左区充分发挥区位优势,积极推进经济转型升级,实现...

排名链接 2024-12-25 阅读0 评论0

天际5,沉浸式游戏体验的巅峰之作

随着科技的不断发展,游戏行业也迎来了前所未有的繁荣。从最初的2D游戏到如今的3D世界,游戏体验得到了质的飞跃。而在这其中,《天际5...

排名链接 2024-12-25 阅读0 评论0

字体设计,传承与创新的艺术之旅

字体,作为人类文明的载体之一,承载着丰富的文化内涵和审美价值。从甲骨文到现代字体,字体设计经历了漫长的发展历程,从传承到创新,始终...

排名链接 2024-12-25 阅读1 评论0

抚顺,打造东北地区网站建设新标杆

近年来,随着互联网技术的飞速发展,网站建设已成为企业宣传、品牌推广的重要途径。抚顺作为辽宁省的重要城市,凭借丰富的资源和独特的区位...

排名链接 2024-12-25 阅读0 评论0

山西代码路,历史沉淀与现代发展的交融

山西,这片拥有悠久历史和丰富文化的土地,自古以来便以其独特的地域特色和人文景观吸引着无数游客。在漫长的历史长河中,山西人民用自己的...

排名链接 2024-12-25 阅读0 评论0