| 网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 |
![]() |
| Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道 |
分析:
根据要求,分解具体需要解决的技术问题如下:
在WinForm程序中定义一个COM visible接口并实现。
将这个Winform程序变为COM服务器(LocalServer)。
将Winform程序的COM对象加入系统的ROT表中。
验证方法:
客户端通过CoCreateInstance(LocalServer)方式激活这个COM对象,应当看到对应的WinForm程序启动,并且CoCreateInstance成功返回我们所需的Interface指针,
客户端调用Interface的相关方法,Winform程序能够成功执行。
Winform程序运行时,客户端能够在ROT取得Winform程序的IUnknown指针。能够成功QI 成所实现的COM接口,并且调用相关方法成功执行。
解决方案:
1. 在WinForm程序中定义一个COM visible接口并实现
在.Net中定义COM 接口可以通过在接口定义上添加GuidAttribute和InterfaceTypeAttribute,定义该接口的IID并告知CLR该接口需要同时导出为普通的IUnknown COM 接口和OLE automation接口。具体例子如下:
网管下载dl.bitscn.com
网管u家u.bitsCN.com
网管论坛bbs_bitsCN_com
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
[Guid(\"CF7C704A-6AC3-4963-8818-EF1493CEC2D1\")]
public interface IProvider

{ 中国网管论坛bbs.bitsCN.com
void Test();
}实现这个interface,
[ClassInterface(ClassInterfaceType.None)]
[Guid(\"58C142C7-E599-4921-BF29-33DC0FCCBECA\")]
public class ProviderImp : IProvider

{ 网管网www_bitscn_com
public void Test()
{ 网管论坛bbs_bitsCN_com
System.Diagnostics.Debug.WriteLine(\"Test\");
}
}
这部分和.Net中实现进程内COM服务器是相同的,在.Net Framework SDK的文档中有详细的介绍。关于在.Net中实现COM组件可以参看MSDN。
2. 将这个Winform程序变为COM服务器(LocalServer)
根据COM本质论中的论述实现进程外COM服务器的需要以下几方面条件;
注册表中对应的CLSID下需要添加LocalServer32键,并把default设为EXE程序的路径
进程外服务器需要在启动时主动向SCM(Service Control Manager)中注册COM Class Object,这样SCM才能创建出对应的COM object返回给客户端,因此.Net程序需要提供一个Class Object(一个实现了IClassFactory COM接口的对象)并调用CoRegisterClassObject将其注册到SCM中。
具体的实现方式根据使用的.Net版本有所差异:对于.Net v2.0及其后版本而言,.Net RegistrationServices类提供了RegisterTypeForComClients和UnregisterTypeForComClients方法能够帮助我们很方便的实现注册和注销。
网管联盟bitsCN_com
private static int cookie;
private static RegistrationServices msRegSvc = new RegistrationServices(); 中国网管联盟bitsCN.com
public static void RegisterServer()

{
Guid clsid = typeof(ProviderImp).GUID;
cookie = msRegSvc.RegisterTypeForComClients(typeof(ProviderImp),
RegistrationClassContext.LocalServer,RegistrationConnectionType.SingleUse);
} 
public static void UnregisterServer() 中国网管论坛bbs.bitsCN.com 

{
msRegSvc.UnregisterTypeForComClients(cookie);
} 

对于.Net 2.0之前的情况,我们可以通过下面的方式使用.Net自己的IClassFactory实现来实现SCM的注册
网管网www.bitscn.com
|
0
|
评论加载中…