Delphi COM编程学习笔记(1)
释放接口对象,既不是调用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)的更多相关文章
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- Linux Shell编程学习笔记——目录(附笔记资源下载)
LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...
- DirectX 11游戏编程学习笔记之8: 第6章Drawing in Direct3D(在Direct3D中绘制)(习题解答)
本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com 注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...
- 多线程编程学习笔记——async和await(一)
接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...
- 多线程编程学习笔记——async和await(二)
接上文 多线程编程学习笔记——async和await(一) 三. 对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...
- 多线程编程学习笔记——async和await(三)
接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五. 处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...
- 多线程编程学习笔记——使用异步IO(一)
接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...
- 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端
接上文 多线程编程学习笔记——使用异步IO 二. 编写一个异步的HTTP服务器和客户端 本节展示了如何编写一个简单的异步HTTP服务器. 1.程序代码如下. using System; using ...
- 多线程编程学习笔记——异步调用WCF服务
接上文 多线程编程学习笔记——使用异步IO 接上文 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端 接上文 多线程编程学习笔记——异步操作数据库 本示例描述了如何创建一个WCF服务,并宿主 ...
随机推荐
- 30余套系统模版|DIV+CSS网页模板|简洁大气系统模板
30余套系统模版|DIV+CSS网页模板|简洁大气系统模板.都是一些后台系统的模版,很适合开发一些管理系统,办公系统,网站后台系统等.使用很广泛,很实用的系统模版. 下载地址: 点击下载
- [Flux] Component / Views
The application will dislay a some catalogs, and each catalog has title image, description. Catalog: ...
- 再回首,Java温故知新(八):Java基础之字符串
字符串是Java中使用频率最高的类,但是它却不属于基本类型,而是预定义了String类来表示.从String类的源码可以看到,String是基于char[]实现的,而且Java中的String是不可变 ...
- Android(java)学习笔记217:开发一个多界面的应用程序之清单文件
清单文件的重要参数: <intent-filter> 代表的应用程序的入口界面 <action android:name=&quo ...
- 提示用户体验的最佳免费 Jquery 表单插件
网页表单是一个老生常谈的话题.出于这样或那样的目的,一些示例中都会包括用户注册,电子商务结算,用户设置甚至联系人表格.而输入栏是非常容易用现代的CSS3技术来应用样式.但是到底什么决定整体用户体验? ...
- JS的replace()的应用
替换字符串中的空格 /\s/ig 例如: var pro="ssss ssss sss ddd ss" var protext = pro.replace(/\s/ig,&qu ...
- call, apply, bind作用
call, apply作用就是(改变方法中的this指向)借用别人的方法来调用,就像调用自己的一样 function Person(name) { this.name = name; } Person ...
- for update和for update nowait的区别和使用
首先,for update 和for update nowait 是对操作的数据行进行加锁,在事务提交前防止其他操作对数据的修改. for update 和for update nowait主要区别在 ...
- 第一章 Javascript基础
一.Javascript概述(知道) a.一种基于对象和事件驱动的脚本语言 b.作用: 给页面添加动态效果 c.历史: 原名叫做livescript.W3c组织开发的标准叫ECMAscipt. d.特 ...
- 【USACO 3.2.2】二进制数01串
[描述] 考虑排好序的N(N<=31)位二进制数. 你会发现,这很有趣.因为他们是排列好的,而且包含所有可能的长度为N且含有1的个数小于等于L(L<=N)的数. 你的任务是输出第I(1&l ...