COM学习笔记:COM和DLL

本文探讨了COM组件在二进制级别实现进程间通信的机制。通过一个具体的COM Server与Client实例,分析了Client如何在不知道Server确切位置的情况下,通过OLE32.DLL找到并使用Server提供的服务。

最近可能要用到com有关的一些东西,所以上网搜了下com的基本知识。 印象中com应该和dll有比较密切的关系,但是又不清楚具体是怎样的。没有搜到相关的说明文章,那么就自己找个例子分析一下吧。
 
例子是从这里发现的:http://msdn2.microsoft.com/en-us/library/2wad1c0e.aspx
用vs 2008,写一个com server and client 还是很方便的。
编译完以后,用depends (http://www.dependencywalker.com/ ) 看了下,发现comtest (客户端)并没有直接调用 myserver.dll (服务端)。但是调用了ole32.dll
那么comtest是什么时候和myserver联系起来的呢?
为了查清楚这个问题,先把comtest.cpp改下,加一个cin >> a;  这样运行comtest的时候要读入一个字符才结束。
运行comtest, 然后拿出我最喜欢的工具:process explorer (www.sysinternals.com ) 看看comtest 到底调用了哪些dll (注意如果在vista下,要用run as administrator 来启动process explorer ) 否则看不到cmd.exe 所调用的dll ).
仔细一看,发现了myserver.dll
 
结论 (部分为猜测)
1。 既然com 提供的是binary level IPC, 那么没有在client端中直接调用 server 的dll 是正常的,因为server 还有可能在其他机器上。这些没法在编译时知道。
2。那么com client 怎么找到server 呢,估计是通过ole32.dll。 向这个dll 查询可能的server.
3。如果server 已经注册过,那么ole32.dll 能够发现这个server dll. 并把它加载进来。然后client 就可以用server 提供的服务了。
 
说白了,就是在一般的exe, dll之间再加了一层。就这么简单。
  

如果有什么不对,不全的地方,欢迎大家补充.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值