COM学习笔记五《COM技术内幕》§5 —— 动态链接

  COM内幕》 §5 —— 动态链

于如何从DLL出函数;如何装DLL;客件的划分。

COM内幕》 §5 —— 动态链接(重新学

1)          件分成多个接口只是将用程序分割成多个部分的第一

2)          然后我使用QueryInterface件抽象成由多个相互独立的接口构成的集合。

3)          下面通过对接口的引用实现对组件生命期的管理。

4)          实现IUnknown之后,件和客只是一非常松散的接,这种松散的系使得件和客各自可以化而不会对对方造成什影响。

5)          一章将讨论如何将件放入到DLL中。

NOTE HERE:并不是要把一个一个DDL。一个实际上并不是一个DLL,将件当成DLL来看待是非常浅的。DLL只是一个件服器,或者是一种发件的方式。实际看成是在DLL中所实现的接口集。DLL只是一形式,而件才是实质

在客可以取某个件接口指之前,它必先将相DLL到其程空中并建此件。第3章中出的CreateInstance可以建立一个件的例并返回一个IUnknown接口指DLL中唯一需要客户显接的函数。由于件中客所需的所有函数都可以通一个接口指访问到,因此需要在DLLCreateInstance函数以便客可以用它。

1)从DLL出函数

DEF文件建立起来也是比的。此可以在某个例子中制一个DEF文件,然后修改其中的某些行。

CMPNT1.DEF

;

;Compnt1 module-definition file.

;

LIBRARY           Compnt1.dll

DESCRIPTION '(c)1996-1997 Dale E.Rogerson'

EXPORTS

    CreateInstance @1 PRIVATE

 

上述文件所需要做的全部工作就是在EXPORTS段中列出待从DLL出的函数的名称。对每个名称,可以加上一个序号。在LIBRARY行上必加上DLL实际名称。

2DLL的装

其中详细讲要用DLL,有点,不想看了。

//

// Create.cpp

//

#include <iostream.h>

#include <unknwn.h>               // Declare IUknown

#include "Create.h"

typedef IUnknown* ( *CREATEFUNCPTR)();

IUnknown* CallCreateInstance(char* name)

{

          // Load dll int process

          HINSTANCE hComponent = ::LoadLibrary(name);

          if(hComponent == NULL)

          {

                    cout << "CallCreateInstance:/tError:Cannot load component." << endl;

                    return NULL;

          }

        

          // Get address for CreateInstance function

          CREATEFUNCPTR CreateInstance

                    = (CREATEFUNCPTR)::GetProcAddress(hComponent, "CreateInstance");

          if(CreateInstance == NULL)

          {

                    cout << "Call CreateInstance:/tError:"

                             << "Cannot find CreateInstance function."

                             << endl ;

                    return NULL;

          }

          return CreateInstance();

}

 

 

在此例中,并没有Create.h的代,我就只写了一个IUnknown* CallCreateInstance(char* name);的声明,我想应该没有系的,即使是空的估也没什(不过这点没实验J)。

3)客件的划分

里,客将在Client1.cpp实现,客文件包括Create.h并将同Create.cpp块链接起来。在2个文件将把建包含在DLL件的程封装起来。件在此是在一个名Cmpnt1.裁判判的文件中实现的。由于动态链接需要一个列出从DLL出的函数名称的模文件,因此在件文件中包括一个名Cmpnt1.def的文件。件和客共享了2个文件。其中之一Iface.和包含Cmpnt1支持的所有接口的声明,其中包含些接口的接口ID声明。些接口ID的定义则在文件GUIDs.cpp中。(但是我实际上是把接口的定放在了相cpp文件中了,不知道不出GUIDs.cpp中定L

使用下面的命令,可以生成客程序Client1.exeDLL文件Cmpnt1.dll

path/ >cl Client1.cpp Create.cpp GUIDs.cpp UUID.lib                 // 建立客程序

path/ >cl /LD Cmpnt1.cpp GUIDs.cpp UUID.lib Cmpnt1.def               // 生成DLL

 

4)回一下整个程:

ÿ         DLLDEF文件和DLL的程序(在后面的章里面,DLL转载和注册将由专门的函数来完成);

ÿ         程序Client写,主要是 #include “” 文件和main( )函数;

ÿ         类继IUnknown接口和其他接口的函数定,构造析函数等等;

ÿ         所有接口的文件声明;

ÿ         IID的定

ÿ         利用上面的command line来建立客程序,生成DLL

今天最大的收就是实现Client1.exeCmpnt1.dll,并且用成功了。J

猜你喜欢

转载自blog.csdn.net/dengrk/article/details/1942473
今日推荐