COM/DCOM开发练习之进程内组件实例

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qipanliming/article/details/7459983

1)使用C++语言实现进程内组件,组建提供加、减、乘、除、判断是否素数等计算服务;客户端部分包括录入和查询部分。

2VC++环境上利用ATL向导进行开发

 

   1.进程内组件

  服务器端:

  创建ATL工程:

VC++->file->new->ATL COM AppWizar->服务类型选服务(DLL)

,如下图所示:


  添加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 "Calculator.h"
#include "calmath.h"
#include<math.h>
/////////////////////////////////////////////////////////////////////////////
// Ccalmath

int 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(int Num1, int Num2, int *result)
{
	// TODO: Add your implementation code here
    *result=Num1*Num2;
	return S_OK;
}

STDMETHODIMP Ccalmath::divide(int Num1, int Num2, int *result)
{
	// TODO: Add your implementation code here
    *result=Num1/Num2;
	return S_OK;
}

STDMETHODIMP Ccalmath::sushu(int Num1, int *result)
{
	// TODO: Add your implementation code here
    *result=issushu(Num1);
	return S_OK;
}


编译连接

编译


连接


  在工程debug目录中可找到calculator.dll组件

  使用命令regsvr32 calculator.dll注册组件

步骤:打开命令提示符,切换到相应目录下,输入如上命令,则得到如下结果;

  

  客户端:

  客户端需要包含服务端编译IDL时生成的calculator.h文件和calculator_i.c文件,在服务端的工程文件夹中可找到。

在相应的工程下,在VC环境中,选择文件->新建->工程->win32 console Application,工程名称中填写:InClient,然后选择“添加到当前工作空间”,从属于一栏打上勾;然后确定;

新建一个文件,选择“保存”,保存到新建的工程中,起名为:inclient.cpp;


在文件中填写代码:

Inclient.cpp的代码如下:

//#define  _WIN32_WINNT  0x0500
#define _WIN32_DCOM 
#include <windows.h>
#include <iostream>
//#import "ComputeService.exe" no_namespace named_guids
#include "../calculator.h"
#include "../calculator_i.c"
using namespace std;
template< class T >
void show( T t )
{
cout << t << endl;
}
void test_dcom1()
{   //初始化COM库
HRESULT hr=::CoInitialize(NULL);
if( !SUCCEEDED( hr ) )
{
show( "init right failed!" );
}
Icalmath * plRF = NULL;
hr=::CoCreateInstance(CLSID_calmath,NULL,CLSCTX_INPROC_SERVER,IID_Icalmath,(void**)&plRF);
if(FAILED(hr))
{
cout<<"创建组件实例失败"<<endl;
}
//调用方法
int data = 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);
           plRF->add(a,b,&data);
   printf("计算结果为:");
           show( data );
   break;
    case 2:    printf("请输入要相减的两个数字:") ;
   scanf("%d%d",&a,&b);
           plRF->sub(a,b,&data);
   printf("计算结果为:");
           show( data );
   break;
    case 3:   printf("请输入要相乘的两个数字:") ;
   scanf("%d%d",&a,&b);
           plRF->multiply(a,b,&data);
   printf("计算结果为:");
           show( data );
   break;
case 4:    printf("请输入要相除的两个数字:") ;
   scanf("%d%d",&a,&b);
           plRF->divide(a,b,&data);
   printf("计算结果为:");
           show( data );
   break;
case 5:    printf("请输入要进行判断的数字:") ;
   scanf("%d",&a);
           plRF->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();
}


对程序进行编译,连接,运行,得到如下结果:



展开阅读全文

没有更多推荐了,返回首页