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 第五章

 

SEM实战教程(四)

SEM实战培训,主要针对零基础到高手的实战操作和数据分析等的系列的培训课程,由SEM实战网老卢培训和服务,以实战为基础,解决竞价中所遇到的问题就是最大的实战,故言SEM实战培训。
  • 2017年03月13日 16:54

[Inside COM][COM技术内幕]

  • 2009年05月27日 17:36
  • 9.21MB
  • 下载

Inside Com 源代码

  • 2012年03月09日 18:05
  • 1.5MB
  • 下载

Inside COM

  • 2014年07月28日 11:01
  • 9.33MB
  • 下载

Inside.COM的随书源代码

  • 2008年03月17日 11:38
  • 1.71MB
  • 下载

Inside Com学习笔记(一)

以前总是接触C/C++的一些皮毛的东西,或者说是基础的东西。一直都没有完成从中级程序员向高级程序员的过渡。现在越来越发现新的知识需求量很大。准备好好研究下COM、STL、Templete。好好学习天天...
  • waterathena
  • waterathena
  • 2007-10-09 13:50:00
  • 635

Inside COM学习笔记(五)

   关于HRESULT、GUID、注册表及其他细节COM使用HRESULT来向用户报告各种情况。HRESULT并不完全是指向某个结果的句柄。HRESULT实际上是一个可分成三个位域的32位值。系统生...
  • waterathena
  • waterathena
  • 2007-10-09 14:03:00
  • 705

Inside COM 学习笔记三

虽然这些东西在后面的发展中可能被隐藏掉或者取消掉,但是知道其原理对技术的发展会有更深刻的理解。**************************学习笔记三**********************...
  • waterathena
  • waterathena
  • 2007-10-09 13:59:00
  • 603

Inside COM学习笔记(二)

接口查询客户同组件的交互都是通过一个接口完成的。在客户查询组件的其他接口时,也是通过接口完成的。这个接口就是IUnknown。IUnknow接口的定义包含在Win32 SDK中的UNKNWN.H头文件...
  • waterathena
  • waterathena
  • 2007-10-09 13:56:00
  • 705

Inside COM souce code

  • 2012年02月25日 12:21
  • 2.16MB
  • 下载
收藏助手
不良信息举报
您举报文章:Inside COM学习笔记(四)
举报原因:
原因补充:

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