请问有谁知道DLL和接口的区别?
解决方案 »
- 数字溢出问题
- 怎么获得pagecontrol的pages的编辑页?在设计模式里。。。。
- 怎样在RichView里指定位置插入一个超链接?
- 为什么提示 '' is not a valid identifier”不能存盘!!!!???
- C++builder6
- AdoQuery在Post时出现错误:“无法为更新行集定位,一些值可能已在最后读取后改变”
- 请问,谁有医院管理系统吗?本人出钱购买,联系方法是:qq:46685781 :[email protected]
- 有谁知道在数据库中追加字段,网络版和单机版有何不同?(急!急!)
- treeview的高效率算法问题!请大家指点!
- 关于DELPHI中读文本文件
- 如何在出来windows桌面之前运行自己的登陆框,运行登陆后能进入桌面???
- 像Delphi那样在窗体上拖动Button是怎么实现的
DLL:是动态链接库,通常指win32中一种可以复用的可执行映像文件。我猜想你的问题是:DLL和com的关系com对象通常都存在于一个DLL中,有时候Com服务器存在于一个Exe中。存在于DLL中的Com,或者说包含Com对象的DLL都遵守一个约定,他们都必须实现以下引出函数
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
在Delphi中这些函数已经实现,不用做这些重复的工作。
其中DllGetClassObject最重要,它是外界获得具体对象接口(这个接口,是特定的,指一个指向二进制结构的指针)的唯一办法。
这个函数的Pascal原形
function DllGetClassObject(const CLSID, IID: TGUID; var Obj): HResult;其中,CLSID是类ID,我认为它表明了一个创建具体对象的类工厂,IID是类工厂接口的ID,通常只有两种。
IClassFactory = interface(IUnknown)
['{00000001-0000-0000-C000-000000000046}']
或者
IClassFactory2 = interface(IClassFactory)
['{B196B28F-BAB4-101A-B69C-00AA00341D07}']
在获得了类工厂接口之后,就可以调用
function CreateInstance(const unkOuter: IUnknown; const iid: TIID;
out obj): HResult; stdcall;
或者
function CreateInstanceLic(const unkOuter: IUnknown; const unkReserved: IUnknown;
const iid: TIID; const bstrKey: WideString; out vObject): HResult; stdcall;
来取得DLL中包含的Com对象的接口了。任何具体的Com对象都是由程序自己创建的,但是基于一个规则,就是创建类工厂,然后用类工厂创建具体对象。
通常,在一个DLL中只有一个com对象,但是,这个对象可以支持多个接口。在Delphi中也是这样。DLL也可以有多个Com对象,但是一个Com对象对应一个类工厂,在Delphi中如此,在很多地方也是这样。