在上篇文章中讲到了CPG插件环境的搭建,实际上主要是使用VS2019这个集成开发环境。由于要使用C++语言环境,因此在安装VS2019的过程中勾选了C++桌面开发环境。CDR软件环境请自行安装X4、X8或其他高版本的64位CDR,因为X4是32位,在接下来的CPG编译过程中,会演示不同版本的编译。CDR软件安装简单,本文将直接跳过,请读者自行安装。在后面的文章中,将默认读者本机已安装了CDR X4和X8版本。好了,现在开发环境有了,从本文正式踏上CPG探索之路。

什么是TLB类型库

在编写代码之前,TLB类型库是必须首先要理解的知识点。TLB,英文缩写是 Type Library,中文含义是类型库,具体形式是一个“.tlb”结尾的文件。TLB文件无法直接双击打开,往往需要借助一些三方工具才能查看。很多软件都提供了自己的类型库文件,CDR也提供了自己的TLB类型库,对应的文件名是 vgcoreauto.tlb(文件名不区分大小写,windows下都是一样的)。

类型库文件也叫做com类型库文件,它封装了针对特定程序的接口相关信息,方便开发者能够通过预定义的接口执行特定的行为。在C++编程语言中,如果需要使用该类型库,可以通过 "#import xxx类型库.tlb" 的形式来导入这个类型库。

CDR提供的TLB类型库文件

在哪里可以找到CDR的类型库文件?对于32位CDR而言,在 CDR安装目录的 Programs 文件夹下面,可以找到 vgcoreauto.tlb 文件;对于64位CDR而言,在 CDR安装目录的 Programs64 文件夹下面,可以找到 vgcoreauto.tlb 文件,如下图所示:

X4版本的类型库所在位置

X8 64位版本的类型库所在位置

CDR的TLB类型库封装了什么

看到这里,或许你已经有了一些疑问,比如:CDR在类型库中封装了什么?怎么查看这个TLB类型库文件中的内容?为什么类型库的名称叫做 vgcoreauto......等等,类似这样的问题。带着心中的疑问,接下来就在VS2019中,动手编译一下TLB类型库文件,看看编译结果,再进一步探索。

创建DLL动态链接库项目

现在,请启动VS2019,在开始界面中,选择“创建新项目”,如下图所示:

然后,在顶部的搜索框中,输入“DLL”,找到 动态链接库(DLL) 的项目模板,然后点击下一步,如下图所示:

为什么选择动态链接库项目模板?因为在本专栏的第1篇文章《001-什么是CPG插件》中就已经提到,CPG插件的本质就是DLL(动态链接库)。所以,要选择这样的项目模板。

在弹出来的项目配置对话框中,按照以下说明来填写。项目取名为 003-compile-cdr-tlb解决方案名称可以改,但目前请不要修改,保持和项目同名就好,也不要勾选“将解决方案和项目放在同一目录中”,后面的文章中会对解决方案和项目的关系在实战过程中进一步演示说明。保存位置放在F盘的一个文件夹(F:\CPG插件学习\),然后点击创建按钮。如果你的磁盘没有特殊情况,建议和我选择的路径保持一致,方便后续截图讲解,如下图所示:

单击创建按钮后,等待VS2019生成项目模板,如下图所示:

项目创建成功后,你会看到如下的界面:

VS2019会自动生成一个 dllmain.cpp 的C++程序文件。这个文件的作用也已经解释得很清楚:定义 DLL 应用程序的入口点。接下来,先对DLL入口点的概念做一个简单的解释,方便读者理解,从而进一步了解CPG插件的运行原理。

什么是DLL应用程序的入口点

如果你看不懂搜索引擎上各种专业晦涩的解释,没关系,可以看下博主的通俗易懂解释:所谓入口点,可以理解为任何一个程序的执行,你必须要告诉程序,从哪里开始运行。正如万里长征第一步,你必须决定从哪里下脚。比如 C、C++、Java语言都有自己的入口方法(main方法),程序从这个入口方法先执行。

DLL动态链接库也是一种应用程序,它有自己的入口。来看看上面的C++程序,APIENTRY 就是一个关键词,它表明 DllMain 这个函数是整个应用程序的入口。你可以看到 DllMain 函数后面的括号中,有很多参数,这些参数就是调用DLL程序时,告诉给DLL程序的信息,这些信息的含义,读者暂时可以不必关注和深入研究。如下图所示:

DLL文件的运行原理,本文不做过多解释和说明,因为这不是本文的重点。以上对于DLL应用程序入口点的说明,是为了让读者有一个初步印象和心理前提,那就是:因为CPG的本质就是DLL文件,所以开发CPG插件的本质,就是编写DLL程序文件。听起来是不是感觉很高级?不用担心,请跟随本专栏的文章,循序渐进,有很多东西,不需要透彻理解,也不需要透彻理解,只知道怎么用就行了。要把时间花在重点的事情上。

编写你的第一行C++代码,并编译DLL

现在,请读者先不要去深究这个C++程序的所有细节,不要去尝试弄懂每一个细节,因为没这个必要。接下来,请开始动手编写你的第一行C++代码,任务目标是:在 dllmain.cpp 文件中,编写一行代码,将CDR类型库文件导入,并成功编译。

第 1 步:在 #include "pch.h" 这行代码下面,复制粘贴一行代码:#import "vgcoreauto.tlb",如下图所示:

#import "vgcoreauto.tlb" 这行代码的作用就是导入CDR的类型库文件。既然导入了类型库,下一步尝试一下是否能够编译成功。

第 2 步:在顶部的“生成(B)”菜单中,找到最下方的“编译(M)”命令,点击执行(或者也可以按快捷键 Ctrl + F7),如下图所示:

不过,点击编译后,你会发现并不顺利,在底部的控制台会输出报错信息:无法打开类型库文件: “vgcoreauto.tlb”: No such file or directory

这是因为,代码指定的库文件“vgcoreauto.tlb”,程序在当前运行目录没有找到该文件。当前运行目录就是当前项目所在的路径。请打开项目所在的路径,如下图所示:

这里做一个补充:VS2019中创建了一个项目后,通常都会生成一个解决方案文件(文件名的后缀是.sln),并使用解决方案去包含项目。你可以理解为,一个解决方案可以包含多个项目,并且,每个项目可以采用不同的语言编写。从上面的报错信息可以知道,在项目文件夹(F:\CPG插件学习\003-compile-cdr-tlb\003-compile-cdr-tlb)中,并没有 vgcoreauto.tlb 这个文件。如下图所示:

既然知道了原因,那么就把 vgcoreauto.tlb 类型库文件,从CDR X4的安装目录中(上文已经有路径说明),复制放到这个文件中,再来尝试编译。注意,这里先使用32位版本的X4的类型库文件,如下图所示:

好了,现在重新尝试编译。你会发现可以编译成功了,如下图所示:

对于CDR X8(64位)的 vgcoreauto.tlb 类型库文件,也可以采用同样的方法编译,直接把 CDR X8安装目录下的 vgcoreauto.tlb 文件拷贝到项目所在目录,替换掉之前的X4类型库文件,也可以编译成功,请读者自行尝试。

查看编译结果

如果是 Debug 配置,编译成功后,会在项目的目录下生成一个 Debug 文件夹,如下图所示:

VS2019顶部菜单的配置选项,默认是 Debug X86 模式

如果是把配置改为X64,会在项目目录中创建 x64 文件夹,里面存放了 Debug 或者 Release 文件夹。如下图所示:

编译后的内容,到底有哪些呢?打开 Debug 目录,会看到,生成了 vgcoreauto.tlh 和 vgcoreauto.tli 文件,这两个文件是CDR相关的,也是需要关注的重点文件

关于这两个文件的含义和内容解析,博主将在下一篇文章中,具体分析它们和CPG插件的关系。

写在最后

写一篇好文章不容易,请通过评论、点赞或收藏支持一下博主。如果有任何问题,可以在本文留言或者WX联系博主提供帮助。

本文涉及到的工程源码,因文件较大,已上传至网盘,请读者添加博主WX,在《CPG插件专栏内部交流》群公告中获取全部工程源码的下载地址。

CDR插件开发之CPG插件003 - 使用VS2019编译CDR类型库 VGCoreAuto.tlb相关推荐

  1. CDR插件开发之CPG插件001 - 什么是CPG插件

    CPG,英文缩写 Corel Plugin,中文含义是 Corel 插件,简称CPG插件,典型代表有魔镜.CDR是鼎鼎大名的创意图形设计软件,几乎是广告.印刷行业的标准,而正是由于CDR在日常的排版. ...

  2. CDR插件开发之CPG插件002 - CPG插件开发环境准备和搭建

    上篇文章对什么是CPG插件做了简单的介绍,读者只需要心中有个概念即可.那么,本篇文章就直接开始动手,正式踏上CPG插件开发之路的必经步骤:开发环境搭建.CPG插件不像GMS插件那样,可以在CDR自带的 ...

  3. CDR插件开发之CPG插件017 - 在VS2019中实现CPG插件调试(自动写入CPG、自动启动CDR)

    在上篇文章中,讲解了图像导出实例:当文档打开后,自动导出当前页面的图像到系统临时文件夹.在之前的CPG插件开发过程中,每次都需要先编写代码.再编译生成CPG,将生成的CPG文件拷贝到CDR所在目录,启 ...

  4. CDR插件开发之CPG插件006 - 怎么实现一个CPG插件类(上篇)

    上篇文章讲到通过暴露 AttachPlugin 函数,使得编译后的CPG插件可以被CDR成功调用,弹出了消息框.然而这个CPG插件,还没有获得CDR提供的编程能力,因为它只有一行实现代码.即便如此,这 ...

  5. CDR插件开发之CPG插件016 -【实例】在CPG插件中动态导出图像到临时文件夹

    在上篇文章中,讲解了文档事件在CPG插件中的开发方式和使用例子.本文在文档事件的基础上,编写一个实用的例子:当文档打开后,自动导出当前页面的图像到系统临时文件夹下面的子文件夹中,子文件夹按照日期动态创 ...

  6. CDR插件开发之CPG插件018 - 在CPG插件中调用外部EXE程序并传递参数

    在上篇文章中,讲解了CPG插件在VS2019中实现调试的具体方法.本文以具体代码为例,讲解在CPG插件中调用外部EXE程序,并传递运行参数的方法. 工程搭建准备 按照惯例,本篇文章的序号为018,请直 ...

  7. CDR插件开发之CPG插件010 - 在CPG插件中实现创建工具栏按钮(下篇,基于X4)

    在上篇文章中,通过代码在标准工具栏上创建了一个自定义图标,但读者会发现这个图标是禁用状态,无法点击.本文将继续完善之前的代码,实现工具栏按钮的启用.动态启用,并为按钮添加单击响应事件,单击后,在当前页 ...

  8. CDR插件开发之Addon插件007 - Addon插件简介和案例演示

    本文讲解了Addon插件的概念和安装位置,介绍了Addon插件的组成结构,演示了如何通过手动拷贝的方式来安装一个Addon类型的CDR插件(力先插件). 如果你更喜欢观看视频教程,请点击下方链接查看视 ...

  9. CDR插件开发之Addon插件003 - 认识解决方案(sln)和项目(csproj)文件

    本文讲解了解决方案和项目之间的关系,手把手演示了如何手动添加现有项目,并通过修改 .sln 文件来配置当前解决方案的项目集合,介绍了 sln 文件 和  csproj 文件的内容结构,演示了对项目进行 ...

最新文章

  1. 微信小程序动画无限循环 掉花
  2. JVM运行时数据区---方法区(前言)
  3. 修改Intelij IDEA的maven下载地址为国内阿里云镜像
  4. 浏览器复制不进行url编码_谷歌浏览器测试版支持在PC上复制号码并操作关联安卓设备进行拨打...
  5. python爬虫-初步使用Scrapy分布式爬虫(爬取mcbbs整合包保存名称及主要mod),大爱MC
  6. js解析json数组+java对象转json字符串
  7. 百度SEO网站链接抓取器 v1.0
  8. 利用doc命令启动与关闭服务
  9. Apriori进行关联分析
  10. HTML复选框可以设置为只读吗?
  11. 7款很棒的 HTML5 视频播放器
  12. 【语谱图】基于matlab语音信号语谱图【含Matlab源码 137期】
  13. i2c-tools安装与使用总结
  14. PNG编解码算法详解
  15. iPad所有平板型号屏幕尺寸
  16. 网络安全篇 防火墙的静态路由-04
  17. 解决win10邮箱无法登陆163企业邮箱的问题
  18. ios 获取沙盒文件名_iOS之沙盒路径
  19. 怎么起用计算机无线开关,笔记本电脑无线网卡,教您如何打开电脑无线网卡开关...
  20. 区块链技术如何运用到知识产权的全生命周期

热门文章

  1. es 修改 mapping 字段类型
  2. win10 wslg安装中文输入法
  3. mysql多表查询sql优化_SQL多表查询优化
  4. 华为鸿蒙发布会直播在哪儿看,2020华为Nova8发布会直播在哪看?附直播/回放在线观看入口...
  5. 林轩田《机器学习基石》(三)——Types of learning
  6. 互联网新时代要到来了(一)什么是Web3.0?
  7. 乐视mysql_乐视MySQL盲注、callback反射型XSS及一处绝对路径泄漏
  8. 初中毕业自考计算机专业难吗,初中毕业自考本科难度大吗 都需要考什么
  9. Keil | 固件包安装,解决Error: Flash Download failed - “Cortex-M7“问题
  10. 绿色情人节,换种方式说 .我爱你