释放接口对象,既不是调用MyObj.Free,也不是MyObj.Release;
破坏对象的正确方法是将它们设置为nil:
MyInterface := nil;

一个接口不能离开实现它的对象而独立存活。这个接口仅仅是一个抽象,它仅仅是一个想法。
接口具有即插即用的功能,它建立了供应商必须遵守的规范。

接口可以仅仅在一层深度上运行,比较简单。不像OOP,一层套一层,一旦改了中间层,即容易引起更下层的错误。
在本质上,接口并不鼓励创建深分层结构,而鼓励相对简单的具有较好的性能特征的程序。

GUID是128位的数字(16个字节),在统计上是唯一的。
为了产生自己的GUID,必须首先调用WINAPI函数CoInitialize来初始化,然后调用CoCreateGuid得到唯一的实例:
CoInitialize(nil);
CoCreateGuid(FGUID);
在32位的Windows中,除了向CoInitialize传递nil之外的任何东西都是错误的。

就COM对象而言,注册表是一个简单的数据库,它只有一个任务:把一个数字值与系统中每一个可用的COM对象联系起来。
这些值存放在HKEY_CLASSES_ROOT的CLSID
注册表是一个数据库,它会建立CLSID与程序的名字以及其它相关信息之间的关联,例如版本号和文件的存储位置。

------------------------------------------------
微软白送几个API
function StringFromCLSID; external ole32 name 'StringFromCLSID';
function CLSIDFromString; external ole32 name 'CLSIDFromString';
function StringFromIID; external ole32 name 'StringFromIID';
function IIDFromString; external ole32 name 'IIDFromString';
function ProgIDFromCLSID; external ole32 name 'ProgIDFromCLSID';
function CLSIDFromProgID; external ole32 name 'CLSIDFromProgID';
function StringFromGUID2; external ole32 name 'StringFromGUID2';
function CoCreateGuid; external ole32 name 'CoCreateGuid';
另外还有几个常见的:
function CoInitialize; external ole32 name 'CoInitialize';
function CoInitializeEx; external ole32 name 'CoInitializeEx';
procedure CoUninitialize; external ole32 name 'CoUninitialize';
function CoGetCurrentProcess; external ole32 name 'CoGetCurrentProcess';
function CoGetClassObject; external ole32 name 'CoGetClassObject';
function CoRegisterClassObject; external ole32 name 'CoRegisterClassObject';
function CoLoadLibrary; external ole32 name 'CoLoadLibrary';
procedure CoFreeLibrary; external ole32 name 'CoFreeLibrary';

------------------------------------------------
最有趣的事情是自己实现IUnknown:
function TUserUnknown.QueryInterface(const IID: TGUID; out Obj): HResult;
const
E_NOINTERFACE = $80004002
begin
// GetInterface是TOjbect的方法。也可这样写:Obj:=Pointer(Self);
// GetInterface用奇妙的方法返回一个小型VMT,它只包含用户需要的接口的方法,而只把Self作为一个可以返回对象中的所有方法的指针
if GetInterface(IID, obj) then result :=0;
else reslut := E_NOINTERFACE;
end;

function TUserUnknown._AddRef : integer;
begin
Inc(FRefCount);
Result := FRefCount;
end;

function TUserUnknown._Release: Integer;
begin
Dec(FRefCount);
Result := FRefCount;
if Result = 0 then Destroy;
end;

------------------------------------------------
为指定接口加上GUID
IName = interface(IUnknown)
['{C25A86F1-579A-419A-8CB1-D1B5C6BCB8CB}']
function GetName : String;
end;
它的优越性在于,它允许你在需要在程序中使用GUID的时候,只需说明一个类名称就可以了。
例如,现在你知道这调用QueryInterface的时候,必须在第一个参数中传递一个GUID,方法只是编写如下代码:
var
Unknown : IUnknown;
Name : IName;
begin
FName.QueryInterface(IUnknown, Unknown);
FName.QueryInterface(IName, Name);
end;

Delphi接口编程比标准Delphi面向对象的编程更为简单,原因是不必为销毁对象而烦恼,一般它将被自动销毁。

------------------------------------------------

参考:《Delphi4 编程技术内幕》第13章

Delphi COM编程学习笔记(1)的更多相关文章

  1. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  2. Linux Shell编程学习笔记——目录(附笔记资源下载)

    LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...

  3. DirectX 11游戏编程学习笔记之8: 第6章Drawing in Direct3D(在Direct3D中绘制)(习题解答)

            本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com         注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...

  4. 多线程编程学习笔记——async和await(一)

    接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...

  5. 多线程编程学习笔记——async和await(二)

    接上文 多线程编程学习笔记——async和await(一) 三.   对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...

  6. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  7. 多线程编程学习笔记——使用异步IO(一)

    接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...

  8. 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端

    接上文 多线程编程学习笔记——使用异步IO 二.   编写一个异步的HTTP服务器和客户端 本节展示了如何编写一个简单的异步HTTP服务器. 1.程序代码如下. using System; using ...

  9. 多线程编程学习笔记——异步调用WCF服务

    接上文 多线程编程学习笔记——使用异步IO 接上文 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端 接上文 多线程编程学习笔记——异步操作数据库 本示例描述了如何创建一个WCF服务,并宿主 ...

随机推荐

  1. Prefix.pch的作用和用法

    一般用于放置宏,省去xcode编译的时间 Hello World_Prefix.pch:扩展名.pch表示"precompiled header",这是一个你工程要用到的来自于外部 ...

  2. cocos2d-x 关于tilemap滚动时黑线闪动的问题

    改动抗锯齿这个全然没用. 解决问题的方法是开启CC_FIX_ARTIFACTS_BY_STRECHING_TEXEL=1.不是在自己的project中开启,而是改动libcocos2dx库来解决 wa ...

  3. 在Eclipse中使用JUnit4进行单元測试(0基础篇)

    本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,须要写成千上万个方法或函数,这些函数的功能可能 ...

  4. html+css+js实现复选框全选与反选

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  5. Day5 - Python基础5 常用模块学习

    Python 之路 Day5 - 常用模块学习   本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shel ...

  6. .Net程序员 Solr-5.3之旅 (一)Solr入门

    阅读目录 引言 Lunece是什么? Solr是什么 JAVA环境搭建 JAVA环境搭建之变量配置 Tomcat简单配置 结尾 引言 君子生非异也,善假于物也. Java和.Net哪个好,我们也不需要 ...

  7. 让VC编译出来的程序不依赖于msvcr80.dll/msvcr90.dll/msvcr100.dll等文件

    ---转载:http://hi.baidu.com/liu_haitao/item/e2157ac3a3c32a0bc610b253 让VC编译出来的程序不依赖于msvcr80.dll/msvcr90 ...

  8. Objective-C学习篇04—多态

    多态 多态的概念 有这样一个例子.早上我和同事说口渴了.结果:A同事拿着我的水杯去给我接了一杯水.B同事顺手在饮水机上拿了一次性纸杯给我接了杯水.C同事给了我一瓶他早上刚买的饮料.同事们得到的是同样的 ...

  9. Swift - 29 - 参数的默认值

    // 参数设置了默认值之后, 在调用的时候, 可以写这个参数 // 在参数前面添加"_", 表示取消外部参数名, 但还是建议使用苹果默认格式 func sayHello(nickN ...

  10. JavaScript_object基础

    之前写Java时老是有点蒙,大部分都是用jQuery,但原理还不是很清楚,最近一段时间在系统的学习JavaScript,有什么问题或错误请指出,多谢..................... Obje ...