建立并调用dcom

通过ATL可以很轻松的建立dll(进程内组件) exe 和服务(进程外组件)

我想这个都很容易搞定。

在工程里插入COM简单对象也很容易,但是有个小毛病是
当建立dcom时需要一个生成一个proxy/stub的dll,这时就有点问题了。

我试过的步骤是,通过VC6的工程->输出制作文件在目录里就会产生
一个扩展名为.mk的makefile文件,这时可以通过手动,通过
cmd进入目录 然后 nmake -f <文件名>.mk就会产生proxy/stub dll文件了。

或者根据 VCHelp里张海涛的文章,在Project->Setting中Post-build step中写
入命令nmake -f <文件名>.mk, 写入后记得一定要输出mk文件,否则
目录里没有mk文件 Post-Build step的设置也就不会工作了。

配置好了有了proxy/stub后编译,然后注册生成的proxy/stub
regsvr32 <文件名>.dll
把生成的dcom也 注册为服务器 <文件名>.exe regserver
另外配置dcom的属性
运行里输入 dcomcnfg,然后找到要配置的dcom
然后查看其属性,设置标识为交互式用户即可。其他都保持默认,我的系统
是Windows XP Professional SP2

然后就可以创建客户端了,建立一个MFC的对话框
然后需要在stdafx.h中加入 #define _WIN32_DCOM,注意一定要加在
<afxwin.h>等头文件的前面
这样预处理器就会根据
此定义来选择性的引入DCOM需要的头文件
相应的CoCreateInstanceEx等函数也就会被支持。

接着需要 将 dcom服务器中的.h文件复制到根目录

然后要包含此文件
然后 将.c中的CLSID IID等复制到项目中。
然后
加入这么一小段代码,如果没有错误就已经连接到服务器了。
一般的错误是服务器的IP和访问权限设置的问题,另外就是在客户端
没有注册 Proxy/stub的中间代理com组件,实际上双方通信是通过此代理组件
进行的。

// TODO: Add extra initialization here
    hr = CoInitialize(NULL);
 if(FAILED(hr))
 {
  MessageBox("组件库加载失败");
  return false;
 }

 hr = CoInitializeSecurity(
        NULL, //Points to security descriptor
        -1, //Count of entries in asAuthSvc
        NULL, //Array of names to register
        NULL, //Reserved for future use
        RPC_C_AUTHN_LEVEL_DEFAULT, //The default authentication level for proxies
        RPC_C_IMP_LEVEL_IDENTIFY, //The default impersonation level for proxies
        NULL, //Reserved; must be set to NULL
        0, //Additional client or server-side capabilities
        NULL //Reserved for future use
        );

 /*通过CONSERVERINFO来配置服务器 billgates为服务器名或IP地址*/
 COSERVERINFO ServerInfo = {0,L"billgates",NULL,0};
 MULTI_QI Multi_qi = {&IID_IUnknown,NULL,NOERROR};
 hr = CoCreateInstanceEx(CLSID_IDcom,NULL,CLSCTX_REMOTE_SERVER,&ServerInfo,1,&Multi_qi);

 if(FAILED(hr))
 {
  MessageBox("创建实例失败.");
  return false;
 }

 pUnknown = (IUnknown*)Multi_qi.pItf;
    hr = pUnknown->QueryInterface(IID_IIDcom,(void**)&dcom);
 pUnknown->Release();
接着你可以使用
查讯的dcom接口也就是IID_IIDcom接口来调用接口了。
实际上的接口根据你创建的项目名和插入的组件名不同而不同。
IID_IIDcom是我插入的简单对象组件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值