Inside COM学习笔记(四)

原创 2007年10月09日 14:02:00

在前面的例子当中客户(main函数)和组件不但是静态链接在一切的,而且它们在同一个文件中。在完全实现了IUnknown之后,组件和客户之间变成非常松散的关系。那么这里讨论如何将组件放入到动态链接库(DLL)中。不是要把组件变成一个DLL。DLL只是一个组件服务器。在这里是要将组件变成在DLL中实现的接口集。

                                                        组件的创建
如何将组件动态链接到客户中。当然这些都是临时性的,后面的知识将进一步分离客户和组件。在客户可以获取某个组件接口指针之前,它必须先将相应的DLL装载到其进程空间中并创建此组件。

从DLL中输出函数
在客户可以获取某个组件接口指针之前,它必须先将相应的DLL装载到其进程空间中并创建次组件。需要在DLL中输出CreateInstance函数以便客户可以调用它。

先将此需要输出的函数用extern "C"进行标记。

//
// Creation function
//
extern "C" IUnknown* CreateInstance()
...{
 IUnknown
* pI = static_cast<IX*>(new CA) ;
 pI
->AddRef() ;
 
return pI ;
}


还需要高手链接程序需要什么输出函数,要建立一个DEF函数。

CMPNT1.DEF
LIBRARY         Cmpnt1.dll
DESCRIPTION     
'(c)1996-1997 Dale E. Rogerson'

EXPORTS
                CreateInstance @
1 PRIVATE


这样就完成了从DLL中输出函数的工作。

DLL装载和调用函数
Create.h和Create.cpp实现了函数CallCreateInstance来装载Dll并调用其中的输出函数CreateInstance()。

//
// Create.h
//

IUnknown
* CallCreateInstance(char* name) ;

//create.cpp

#include 
<iostream.h>
#include 
<unknwn.h>    // Declare IUnknown.

#include 
"Create.h"

typedef IUnknown
* (*CREATEFUNCPTR)() ;

IUnknown
* CallCreateInstance(char* name)
...{
 
// Load dynamic link library into process.
 HINSTANCE hComponent = ::LoadLibrary(name) ;
 
if (hComponent == NULL)
 
...{
  cout 
<< "CallCreateInstance: Error: Cannot load component." << endl ;
  
return NULL ;
 }


 
// Get address for CreateInstance function.
 CREATEFUNCPTR CreateInstance 
  
= (CREATEFUNCPTR)::GetProcAddress(hComponent, "CreateInstance") ;
 
if (CreateInstance == NULL)
 
...{
  cout  
<< "CallCreateInstance: Error: "
        
<< "Cannot find CreateInstance function."
        
<< endl ;
  
return NULL ;
 }


 
return CreateInstance() ;
}


LoadLibrary以被装载的DLL的名称作为参数并返回一个指向所装载的DLL的句柄。
Win32的GetProAdress函数可以使用此句柄以及待调用的函数的名称,然后返回一个指向次函数的指针。

完整的例子参见Inside com 第五章

 

Inside COM读书笔记------接口

1.接口的作用 组件可以充应用程序中删除并可用另外一个组件代替,只要新的组件支持同样的接口。单个组件并不能起决定性作用,相反,用以连接组件的接口对应用程序亲戚到决定性作用。使用组件来构成应用...
  • wangqiulin123456
  • wangqiulin123456
  • 2013年05月09日 19:01
  • 1734

Inside COM读书笔记-----多线程

1.      COM线程模型 COM并没有定义新的线程和进程模型,而是直接使用Win32线程。 1.1Win32线程          典型的Win32线程具有两种不同...
  • wangqiulin123456
  • wangqiulin123456
  • 2013年05月22日 21:24
  • 2245

重读COM技术内幕(inside com)有感

重读COM技术内幕(inside com)有感面向对象设计哲学在复杂领域并不能很好地解决问题。参考(http://www.richardlord.net/blog/what-is-an-entity-...
  • cheungmine
  • cheungmine
  • 2016年06月07日 12:59
  • 6338

Inside COM读书笔记-----包容和聚合

1.      包容和聚合 包容和聚合实际上是使一个组件使用另一个组件的一种技术。 包容简介          外部组件包含指向内部组件接口的指针,外部组件只是内部组件的一个客户。外部组件也可以...
  • wangqiulin123456
  • wangqiulin123456
  • 2013年05月22日 20:57
  • 2608

Inside COM读书笔记------动态链接库

1.      组件的创建 在客户获取某个组件接口指针之前,必须先将相应的DLL装载到起进程空间中并创建此组件。 从DLL中输出函数 先将需要输出的函数用extern “C”进行...
  • wangqiulin123456
  • wangqiulin123456
  • 2013年05月13日 20:56
  • 2358

Inside COM读书笔记-----类厂

1.CoCreateInstance      通过传人参数CLSID创建相应组件的一个实例,并返回此组件实例的某个接口。      CoCreateInstance的声明 ...
  • wangqiulin123456
  • wangqiulin123456
  • 2013年05月14日 18:38
  • 2475

Inside COM读书笔记------引用计数

1.      生命期控制 当使用完一个接口而仍要使用另外一个接口时,是不能将此组件释放掉的。很难知道两个指针是否指向同一个对象。IUnknown的另外两个函数AddRef和Release来...
  • wangqiulin123456
  • wangqiulin123456
  • 2013年05月13日 20:53
  • 1988

Inside COM读书笔记-----ExE中的服务器

1.      不同的进程 每一个EXE文件都将在不同的进程中运行,而每一个进程都有其自己的进程空间。一个进程空间中的逻辑地址0X0000ABBA所对应的物理地址将不同于另外一个进程中同一逻辑地址所...
  • wangqiulin123456
  • wangqiulin123456
  • 2013年05月22日 21:09
  • 2382

《Inside C#》笔记(四) 类

类是对数据结构和算法的封装。   一 类成员 类成员包括以下几类,作者在后面的章节会详细讲解。 字段(用来保存数据,可用static readonly const来修饰)、方法(操作数据的代码...
  • zhixin9001
  • zhixin9001
  • 2017年06月18日 22:33
  • 70

Inside COM读书笔记-----调度接口与自动化

1.  一种新的通信方式 IDispatch为客户和组件提供了另外一种通信方式,有了IDispatch后,COM组件可以通过一个标准的接口提供它所支持的服务,而无需提供多个特定与服务的接口。...
  • wangqiulin123456
  • wangqiulin123456
  • 2013年05月22日 21:15
  • 3783
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Inside COM学习笔记(四)
举报原因:
原因补充:

(最多只允许输入30个字)