COM/DCOM开发练习之远程进程外组件实例
来源:互联网 发布:剑网三dbm数据导入 编辑:程序博客网 时间:2024/05/22 05:11
1)使用C++语言实现远程进程外组件,组建提供加、减、乘、除、判断是否素数等计算服务;客户端部分包括录入和查询部分。
2)在VC++环境上利用ATL向导进行开发。
3.远程进程外组件(DCOM)
服务器端:
创建ATL工程:VC++->file->new->ATL COM AppWizar->服务类型选服务(service)
工程名称为:COMCalculator,如图所示:
添加com对象, Insert-New ATL Object,添加shortname:calmath,其他则会自动添加;
在工作空间中,选择com接口(即Icalmath),右键->ADD methods,添加提供的服务(方法)
输入Method Name:add
Parameters:[in] int Num1, [in] int Num2, [out] int *result
如下图所示:
按照同样方法,添加方法:sub,multiply,divide,sushu;
如下图所示:
打开calmath.cpp文件(双击添加的方法即可打开),写入实现方法的代码:
Calmath.cpp代码如下:
// calmath.cpp : Implementation of Ccalmath#include "stdafx.h"#include "COMCalculator.h"#include "calmath.h"#include<math.h>/////////////////////////////////////////////////////////////////////////////// Ccalmathint issushu(int s){int i;if(s==2||s==1) return 1;for(i=2;i<sqrt(s);i++){if(s%i==0) return 0;}return 1;}STDMETHODIMP Ccalmath::add(int Num1, int Num2, int *result){// TODO: Add your implementation code here *result=Num1+Num2;return S_OK;}STDMETHODIMP Ccalmath::sub(int Num1, int Num2, int *result){// TODO: Add your implementation code here *result=Num1-Num2;return S_OK;}STDMETHODIMP Ccalmath::multiply(long Num1, long Num2, long *result){// TODO: Add your implementation code here *result=Num1*Num2;return S_OK;}STDMETHODIMP Ccalmath::divide(long Num1, long Num2, long *result){// TODO: Add your implementation code here *result=Num1/Num2;return S_OK;}STDMETHODIMP Ccalmath::sushu(int Num, int *result){// TODO: Add your implementation code here *result=issushu(Num);return S_OK;}
编译连接
在工程debug目录中可找到COMCalculator.exe组件
使用COMCalculator.exe /RegServer /Service 注册服务
net start COMCalculator.exe 启动服务
如下图所示:
产生代理/存根
使用服务端工程文件夹中新建一个文件夹,名称为DCOM,并将服务端工程文件夹中calmath.h,COMCalculator_i.c,COMCalculator_p.c和dlldata.c文件保存到文件夹中,并编写COMCal.def,内容如下:
LIBRARY "COMCal.dll"
EXPORTS
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
GetProxyDllInfo PRIVATE
然后新建一个win32 Dynamic-Link Library工程,工程名称命名为:dcom,位置为刚才的文件夹下;
工作空间一栏切换到fileview,然后添加文件到工程,将上述文件都添加进去;
编译得到COMCal.dll即代理存根
进行相应设置:
工程->设置->C/C++预处理器定义,加入:REGISTER_PROXY_DLL
工程->设置->连接->对象/库模块,加入:rpcrt4.lib
编译,出现:“You need a Windows NT 4.0 or later to run this stub because it uses these features:”的错误;
解决办法:工程->设置->C/C++预处理器定义,加入::_WIN32_WINNT=0x0500
再进行编译,最终得到结果:
Debug中出现如下文件:
使用regsvr32 dcom.dll在服务器/客户端分别注册
在服务器端(本电脑)注册:
结果如图:
在客户端注册(另一台电脑上):
首先将dcom.dll复制到另一台电脑上,然后找到相应目录:
结果如图:
然后开始编写客户端代码:
新建一个WIN32 console application工程,命名为:ProxyClient
在工程中添加client.cpp,编写代码,
注:在include中要加入COMCalculator.h,COMCalculator_i.c文件;
Client.cpp的代码为:
//#define _WIN32_WINNT 0x0500#define _WIN32_DCOM #include <windows.h>#include <iostream>//#import "ComputeService.exe" no_namespace named_guids#include "../COMCalculator.h"#include "../COMCalculator_i.c"using namespace std;template< class T >void show( T t ){cout << t << endl;}void test_dcom1(){HRESULT hr;hr = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE, RPC_C_IMP_LEVEL_IDENTIFY, NULL, EOAC_NONE, NULL );if( !SUCCEEDED( hr ) ){show( "init right failed!" );}COSERVERINFO si;MULTI_QI qi;ZeroMemory( &si, sizeof( si ) );ZeroMemory( &qi, sizeof( qi ) );si.pwszName = L"127.0.0.1";si.pAuthInfo = NULL;qi.pIID = &IID_Icalmath;qi.pItf = NULL;hr = CoCreateInstanceEx(CLSID_calmath, NULL, CLSCTX_REMOTE_SERVER, &si, 1, &qi);if( FAILED( hr ) ){cout << "can not create myobject : " << GetLastError() << endl;return;}if (FAILED(qi.hr)){cout << "can not create myobject : " << GetLastError() << endl;return;}//////////////////////////////////// Icalmath * pT = NULL;qi.pItf->QueryInterface( &pT );qi.pItf->Release();int data = 0;long result=0.0;int flag;int a,b;printf("请选择:1.加;2.减;3.乘;4.除;5.判断素数(注:1表示素数;0表示非素数);0.退出\n");scanf("%d",&flag);while(flag!=0){switch(flag){ case 1: printf("请输入要相加的两个数字:") ; scanf("%d%d",&a,&b); pT->add(a,b,&data); printf("计算结果为:"); show( data ); break; case 2: printf("请输入要相减的两个数字:") ; scanf("%d%d",&a,&b); pT->sub(a,b,&data); printf("计算结果为:"); show( data ); break; case 3: printf("请输入要相乘的两个数字:") ; scanf("%d%d",&a,&b); pT->multiply(a,b,&result); printf("计算结果为:"); show( result ); break;case 4: printf("请输入要相除的两个数字:") ; scanf("%d%d",&a,&b); pT->divide(a,b,&result); printf("计算结果为:"); show( result ); break;case 5: printf("请输入要进行判断的数字:") ; scanf("%d",&a); pT->sushu(a,&data); printf("判断结果为:"); show( data ); break; case 0:break;default:break;}printf("请选择:1.加;2.减;3.乘;4.除;5.判断素数(注:1表示素数;0表示非素数);0.退出\n");scanf("%d",&flag);}pT->Release(); }void main(){CoInitialize( NULL );test_dcom1();CoUninitialize();}
在客户端运行程序,程序运行结果如下:
- COM/DCOM开发练习之远程进程外组件实例
- COM/DCOM开发练习之进程外组件实例
- COM/DCOM开发之远程进程外组件(DCOM)
- COM/DCOM开发练习之进程内组件实例
- COM/DCOM开发练习之进程内组件实例
- COM/DCOM开发之进程外组件
- COM/DCOM开发之进程内组件
- 进程外COM组件的一个实例
- 分布式组件开发 DCOM
- 组件模型:COM/DCOM、CORBA、KCOM
- 组件模型:COM/DCOM、CORBA、KCOM
- 组件模型:COM/DCOM、CORBA、KCOM
- COM与.NET调用DCOM组件
- DCOM揭秘之六——远程COM调用(服务器端和客户端)
- QT进程外COM组件之OCX控件华丽转身
- com进程内进程外组件
- 进程外COM组件的单实例化和Register-free
- DCOM 示例:演示如何远程调用 COM 对象
- 从海量数据中找出中位数
- 第九周任务一之Complex类流运算符的重载
- nodejs win7下安装
- nand flash 读写操作
- Bash 实例,第一部分
- COM/DCOM开发练习之远程进程外组件实例
- viusal studio 6.0/ VC 6.0 SP6 补丁版本检测方法(可能是总结最全面的检测方法)
- 23种设计模式 通俗易懂
- 第九周实验任务二--定义Complex类中的<<和>>运算符的重载,实现输入和输出,使程序读起来更自然
- 无线网络密码正确,为何提示身份验证,无法连接
- 候选键定义
- #、##和__VA_ARGS__
- Bash 实例,第 2 部分
- 素数判断(数论)