DCOM的实现与配置

图像标定系统 专栏收录该内容
1 篇文章 0 订阅

系统已有一个用COM实现的ImageHelp.dll,现需要用DCOM重新实现,这样只需将dll放在实验室服务器上,客户端访问即可。

服务器、客户端:WindowsXP SP3、VS2005

实现步骤:

一、实现服务器端程序ImageHelp.exe

VS2005创建一个ATL项目---向导选择“可执行文件(EXE)”,其它不改---项目增加一个“ATL简单对象”---“简单对象向导”中“选项”步骤中只将“接口”改为“自定义”,其它不改---在定义的接口中增加相关的方法,具体代码与ImageHelp.dll中一样---实现代码后,生成COMServer和COMServerPS两个项目(会自动在服务器上注册)。

二、配置服务器

(1)“本地安全策略”中“安全选项”中的有关策略;
1、“DCOM:...........访问限制”:增加ANONYMOUS LOGON组的“远程访问”权限;
2、“DCOM:...........启动权限”:增加ANONYMOUS LOGON组的所有权限;
3、“网络访问:本地帐户的共享和安全模式”:设置为 “经典-本地用户以自己的身份验证”;

(2)“组件服务”中“我的电脑”属性;
1、“默认属性”页:(1)选择“在此计算机上启用分布式COM(E)”复选框;(2)“默认身份验证级别”设置为“连接”;(3)“默认模拟级别”设置为“标识”;
2、“默认协议”页:添加“面向连接的TCP/IP”协议;
3、“COM安全”页:(1)“访问权限”组合框里,点击选择“编辑限制”,添加INTERACTIVE和EveryOne用户,并分配足够的权限;(2)“启动和激活权限”组合框里,点击选择“编辑限制”,添加INTERACTIVE和EveryOne用户,并分配足够的权限;

(3)“组件服务”中“我的电脑”中“DCOM配置”中ImageHelp属性;
1、“选择”页:“身份验证级别”选择“连接”属性;
2、“位置”页:选择“在此计算机上运行应用程序”复选框;
3、“安全”页:(1)“启动和激活权限”组合框,选择“自定义”,点击“编辑”,添加INTERACTIVE和EveryOne用户,并分配足够权限,还有对其它的用户也要相应添加相应的权限;(2)“访问权限”组合框,选择“自定义”,点击“编辑”,添加EveryOne用户,并分配足够权限,还有对其它的用户也要相应添加相应的权限;
4、“终结点”页:添加“面向连接的TCP/IP”协议;
5、“标识”页:选择“交互式用户”;

(4)“计算机管理”中“本地用户和组”中“用户”中添加用户(要与客户端登录的用户名和密码完全一致);
注:如果Administrator用户消失,则打开“HKEY_LOCAL_MACHINE/ SOFTWARE/ Microsoft/ Windows NT/ CurrentVersion/ Winlogon/ SpecialAccounts/ UserList”分支,将右边的Administrator的值(DWORD)改为1,即可让Administrator账户出现在登录的欢迎屏幕上。

(5)开启Guest账户??(已开启)

(6)Windows防火墙的配置??(已关闭)

三、实现客户端程序

(1)复制服务器端的ImageHelp.h和ImageHelpPS.dll两个文件,ImageHelp.h是接口说明文件,ImageHelpPS.dll是存根代理,在客户端需要注册(regsvr32 ImageHelpPS.dll);

(2)客户端stdafx.h中包含
#define _WIN32_DCOM
#include "ImageHelp.h"

(3)客户端程序中包含COM的IID和CLSID(数据来自ImageHelp_i.c文件)
const IID IID_IFun = {0x512D08D8,0x2EDF,0x48EC,{0x9E,0x80,0x9E,0xB4,0xEA,0x56,0x8E,0x13}};
const IID LIBID_COMServerLib = {0x77A72BBE,0x5887,0x4055,{0x9A,0x4E,0x6B,0xA4,0xC4,0x57,0x55,0x74}};
const CLSID CLSID_Fun = {0xC5EF2729,0x6280,0x445E,{0xAF,0x6E,0x57,0x2B,0x8C,0x3B,0xE1,0x7F}};

(4)客户端调用服务器程序
IFun *pFun;
IUnknown *pUnknown;
//组件库初始化
HRESULT hr = CoInitialize(NULL); 
if(FAILED(hr)) 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
    );
//创建对象实例,并返回IUnknown 指针
COSERVERINFO ServerInfo = {0,L"172.16.21.30",NULL,0};//服务器IP
MULTI_QI MultiQi = {&IID_IUnknown,NULL,NOERROR};
hr = CoCreateInstanceEx(CLSID_Fun,NULL,CLSCTX_REMOTE_SERVER,&ServerInfo,1,&MultiQi);
if(FAILED(hr))  return false;
//通过IUnkonwn指针去查询接口指针,返回IFun指针
pUnknown = (IUnknown *) MultiQi.pItf;
hr = pUnknown->QueryInterface(IID_IFun,(void**)&pFun);
if(FAILED(hr)) return false;
pUnknown->Release();
//调用ImageHelp.exe中的函数
/*pFun->Function();*/
//接口释放
pFun->Release();
//组件释放
CoUninitialize();

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

ndkjjsj

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值