以下这篇笔记将详细的介绍如何用动态链接库去实现COM组件。
首先,我们先完成我们所需的接口的创建工作,这样,COM组件就会根据其接口实现之。
定义IFACE.H,这个头文件要被DLL及客户端EXE共享。
可以看到,我们定义了三个接口,分别为IX,IY,IZ.
下面我们实现组件。新建一个DLL项目,项目名为CMNPT,在VC创建过程中默认为空dll项目.
然后,添加头文件libport.h,和源文件libport.cpp.
在libport.h中,定义了该dll的输出函数:
到时,一个DLL定义就完成了,下面就要实现客户端对组件的调用.
新建一项目,名为Client.在这个项目下建立Create.h与Create.cpp文件.分别如下:
可以看到CreateInstance是调用了LoadLibaray来调用组件的DLL,然后,获得CreateInstance函数的地址,调用后得到IUnknown的指针.
下面的步骤是在main函数中调用CallCreateInstance函数,获得IUnknown指针,查询接口,调用组件的实现...
通过以上步骤,一个用动态链接库实现的DLL就作出来了,但其还有许多瑕疵,比如需要知道组件的dll名称及dll的存放位置,需要显式的调用GetProcAddress函数以获得组件的CreateInstance函数地址。
有没有一种方式,不需要知道组件的dll名,也不用知道该dll在磁盘的什么地方,都可以调用到这个dll,然后加载,获得接口?这个方法在下一节中会详述。