营销型网站建设合同,wordpress支持asp.net,百度指数怎么下载,wordpress中有趣的插件COM 组件设计与应用#xff08;七#xff09;编译、注册、调用作者#xff1a;杨老师 一、前言 上两回中#xff0c;咱们用 ATL 写了第一个 COM 组件程序#xff0c;这回中#xff0c;主要介绍编译、注册和调用方法。示例程序你已经下载了吗#xff1f;如果还没有下载…COM 组件设计与应用七编译、注册、调用作者杨老师 一、前言 上两回中咱们用 ATL 写了第一个 COM 组件程序这回中主要介绍编译、注册和调用方法。示例程序你已经下载了吗如果还没有下载vc6.0 的用户点这里vc.net 的用户点这里。二、关于编译 2-1 最小依赖 “最小依赖”表示编译器会把 ATL 中必须使用的一些函数静态连接到目标程序中。这样目标文件尺寸会稍大但独立性更强安装方便反之系统执行的时候需要有 ATL.DLL 文件的支持。如何选择设置为“最小依赖”呢答案是删除预定义宏“_ATL_DLL”操作方法见图一、图二。图一、在vc6.0中设置方法图二、在 vc.net 2003中设置方法 2-2 CRT库 如果在 ATL 组件程序中调用了 CRT 的运行时刻库函数比如开平方 sqrt() 那么编译的时候可能会报错“error LNK2001: unresolved external symbol _main”。怎么办删除预定义宏“_ATL_MIN_CRT”操作方法也见图一、图二。vc.net 2003 中的这个项目属性叫“在 ATL 中最小使用 CRT” 2-3 MBCS/UNICODE 这个不多说了在预定义宏中分别使用 _MBCS 或 _UNICODE。 2-4 IDL 的编译 COM 在设计初期就定了一个目标要能实现跨语言的调用。既然是跨语言的那么组件的接口描述就必须在任何语言环境中都要能够认识。怎么办用 .h 文件描述------ C语言程序员笑了真方便BASIC 程序员哭了:-( 因此微软使用了一个新的文件格式---IDL文件接口定义描述语言。IDL 是一个文本文件它的语言语法比较简单很象C。具体 IDL 文件的讲解见下一回《COM 组件设计与应用八之添加新接口》。IDL 经过编译生成二进制的等价类型库文件 TLB 提供给其它语言来使用。图三示意了 ATL COM 程序编译的过程图三、ATL 组件程序编译过程 说明1编译后类型库以 TLB 文件形式单独存在同时也保存在目标文件的资源中。因此我们将来在 #import 引入类型库的时候既可以指定 TLB 文件也可以指定目标文件 说明2我们作为 C/C 的程序员还算是比较幸福的。因为 IDL 编译后特意为我们提供了 C 语言形式的接口文件。 说明3IDL 编译后生成代理/存根源程序有dlldata.c、xxx_p.c、xxxps.def、xxxps.mak我们可以用 NMAKE.EXE 再次编译来产生真正的代理/存根DLL目标文件(注1)。三、关于注册 情况1当我们使用 ATL 编写组件程序注册不用我们来负责。编译成功后IDE 会帮我们自动注册 情况2当我们使用 MFC 编写组件程序由于编译器不知道你写的是否是 COM 组件所以它不会帮我们自动注册。这个时候我们可以执行菜单“Tools\Register Control”来注册。 情况3当我们写一个具有 COM 功能的 EXE 程序时注册的方法就是运行一次这个程序 情况4当我们需要使用第三方提供的组件程序时可以命令行运行“regsvr32.exe 文件名”来注册。顺便说一句反注册的方法是“regsvr32.exe /u 文件名” 情况5当我们需要在程序中比如安装程序需要执行注册那么上面的示例在多数情况下可以简化掉切换工作目录的代码部分。但是如果这个组件在装载的时候它需要同时加载一些必须依赖的DLL时有可能由于它自身程序的 BUG 导致无法正确定位。咳......还是让我们自己写的程序来弥补它的错误吧......谁让咱们是好人呢 谁让咱们的水平比他高呢谁让咱们在 vckbase上是个“榜眼”呢......四、关于组件调用 总的来说调用组件程序大概有如下方法 #include 方法IDL编译后为方便C/C程序员的使用会产生xxx.h和xxx_i.c文件。我们真幸福直接#include后就可以使用了#import 方法比较通用的方法vc 会帮我们产生包装类让我们的调用更方便加载类型库包装类 方法如果组件提供了 IDispatch 接口用这个方法调用组件是最简单的啦。不过还没讲IDispatch只能看以后的文章啦加载ActiveX包装类 方法ActiveX 还没介绍呢以后再说啦 下载示例程序后请逐项浏览使用方法 示例 方法 简要说明1#include完全用最基本的 API 方式调用组件使大家熟悉调用原理2#include大部分使用 API 方式使用 CComBSTR 简化对字符串的使用3#include展示智能指针 CComPtr 的使用方法4#include展示智能指针 CComPtr 和 CComQIPtr 混合的使用方法5#include展示智能指针 CComQIPtr 的使用方法6#include展示智能指针的释放方法7#importvc 包装的智能指针 IxxxPtr、_bstr_t、_variant_t 的使用方法和异常处理8#importimport 后的命名空间的使用方法 示例程序中都写有注释请读者仔细阅读并同时参考 MSDN 的函数说明。这里我给大家介绍一下“智能指针” 对于操作原始的接口指针是比较麻烦的需要我们自己控制引用记数、API 调用、异常处理。于是 ATL 提供了2个智能指针的模板包装类CComPtr 和 CComQIPtr这两个类都在 atlbase.h 中声明。CComQIPtr 包含了 CComPtr的所有功能因此我们可以完全用 CComQIPtr 来使用智能接口指针唯一要说明的一点就是CComQIPtr 由于使用了运算符的重载功能它会自动帮我们调用QueryInterface()函数因此 CComQIPtr 唯一的缺点就是不能定义 IUnknown * 指针。给智能指针赋值的方法智能指针调用函数的方法咳......不说了不说了大家多看书多看MSND多看示例程序吧。 写累了:-(五、小结 敬请关注《COM 组件设计与应用(八)》------如何增加 ATL 组件中的第二个接口 注1编译代理/存根vc6.0 中稍微麻烦我们在后面介绍“进程外组件”和“远程组件”的时候再介绍。在 vc.net 2003 下则比较简单因为代理/存根作为单独的一个工程项目会自动加到我们的解决方案中了。转载于:https://www.cnblogs.com/cdo/archive/2005/10/14/254633.html