上一篇文章里,在一个CPP文件中实现了组件IX,IY,及组件CA,以及在客户端对接口的查询,但其还不是一个COM,COM的许多特性还没有被展现出来.比如,用动态链接库实现,没有这个我就不能根据需要随意的加载和卸载组件,组件无法复用等功能。
 
    以下这篇笔记将详细的介绍如何用动态链接库去实现COM组件。
 
    首先,我们先完成我们所需的接口的创建工作,这样,COM组件就会根据其接口实现之。
    定义IFACE.H,这个头文件要被DLL及客户端EXE共享。
   
   
动态链接库实现COM(COM技术内幕笔记之二)//In IFACE.H
动态链接库实现COM(COM技术内幕笔记之二)
#ifndef _IFACE_H
动态链接库实现COM(COM技术内幕笔记之二)
#define _IFACE_H
动态链接库实现COM(COM技术内幕笔记之二)
动态链接库实现COM(COM技术内幕笔记之二)
//interfaces
动态链接库实现COM(COM技术内幕笔记之二)
interface IX:IUnknown
#endif


 可以看到,我们定义了三个接口,分别为IX,IY,IZ.
 下面我们实现组件。新建一个DLL项目,项目名为CMNPT,在VC创建过程中默认为空dll项目.
 然后,添加头文件libport.h,和源文件libport.cpp.
 在libport.h中,定义了该dll的输出函数:
 
动态链接库实现COM(COM技术内幕笔记之二)//In libport.h
动态链接库实现COM(COM技术内幕笔记之二)
#ifndef _LIBPORT_H
动态链接库实现COM(COM技术内幕笔记之二)
#define _LIBPORT_H
动态链接库实现COM(COM技术内幕笔记之二)
动态链接库实现COM(COM技术内幕笔记之二)#include 
"objbase.h"
动态链接库实现COM(COM技术内幕笔记之二)
动态链接库实现COM(COM技术内幕笔记之二)#ifndef MYLIBAPI
动态链接库实现COM(COM技术内幕笔记之二)
#define MYLIBAPI extern "C" __declspec(dllimport)
动态链接库实现COM(COM技术内幕笔记之二)
#endif
动态链接库实现COM(COM技术内幕笔记之二)
动态链接库实现COM(COM技术内幕笔记之二)MYLIBAPI IUnknown
* CreateInstance();  //此为输出函数,以供客户端调用,客户可以根据这个函数来创建组件。
动态链接库实现COM(COM技术内幕笔记之二)

动态链接库实现COM(COM技术内幕笔记之二)
#endif
动态链接库实现COM(COM技术内幕笔记之二)
动态链接库实现COM(COM技术内幕笔记之二)在libport.cpp中,实现了组件CA
动态链接库实现COM(COM技术内幕笔记之二)
//In libport.cpp
动态链接库实现COM(COM技术内幕笔记之二)
#include "libport.h"
动态链接库实现COM(COM技术内幕笔记之二)#include 
<iostream.h>
动态链接库实现COM(COM技术内幕笔记之二)#include 
"IFACE.h"
动态链接库实现COM(COM技术内幕笔记之二)
动态链接库实现COM(COM技术内幕笔记之二)#ifndef MYLIBAPI
动态链接库实现COM(COM技术内幕笔记之二)
#define MYLIBAPI extern "C" __declspec(dllexport)
动态链接库实现COM(COM技术内幕笔记之二)
#endif
动态链接库实现COM(COM技术内幕笔记之二)


 到时,一个DLL定义就完成了,下面就要实现客户端对组件的调用.
 新建一项目,名为Client.在这个项目下建立Create.h与Create.cpp文件.分别如下:



 可以看到CreateInstance是调用了LoadLibaray来调用组件的DLL,然后,获得CreateInstance函数的地址,调用后得到IUnknown的指针.
 下面的步骤是在main函数中调用CallCreateInstance函数,获得IUnknown指针,查询接口,调用组件的实现...

动态链接库实现COM(COM技术内幕笔记之二)//In client.cpp
动态链接库实现COM(COM技术内幕笔记之二)
int main()


    通过以上步骤,一个用动态链接库实现的DLL就作出来了,但其还有许多瑕疵,比如需要知道组件的dll名称及dll的存放位置,需要显式的调用GetProcAddress函数以获得组件的CreateInstance函数地址。
    有没有一种方式,不需要知道组件的dll名,也不用知道该dll在磁盘的什么地方,都可以调用到这个dll,然后加载,获得接口?这个方法在下一节中会详述。

相关文章:

  • 2022-01-16
  • 2021-07-04
  • 2022-12-23
  • 2021-08-13
  • 2021-10-09
  • 2022-12-23
  • 2021-08-02
  • 2021-11-13
猜你喜欢
  • 2021-08-01
  • 2022-12-23
  • 2021-12-15
  • 2021-12-19
  • 2021-08-10
  • 2021-09-23
  • 2022-12-23
相关资源
相似解决方案