标签:style blog class code c tar
作者 : 卿笃军
题目说明:
仿照例题,在其基础上实现以下功能:
1)使用C++语言实现进程内组件,组件提供复数的加、减、乘、除等计算服务;客户端部分包括录入(实部和虚部分开录入)和查询部分。
2)在VC++环境上利用ATL向导进行开发。
3)至少实现三种运行模式中的两种。
4) 程序设计风格良好,有文档注释,方法注释,语句注释。并附带说明文档。
5)下周六晚10点前统一发至我邮箱。
开工、首先编写服务器端利用ATL COM AppWizard开发出 CalcSvr.dll
第一步:打开VC++6.0选择 ATL COM AppWizard ,然后在工程名处输入 CalcSvr 目录我们这里选择 E:\Ock
点击确定,进入下一步后,全部默认,点击完成!
第二步:开始创建我们的ATL类了,其作用就是实现.dll的功能。
点击插入->类 如下图:
然后,开始创建ATL类,类的类型选择 ATL Class,类名称我这里输入CCalcMath,其它不要动,点击确定。
第三步:添加类方法,看到刚才创建的那个CCalcMath类了吧?右击ICalcMath然后选择Add Method添加方法。
第四步:输入类名和类参数,注意这里类参数直接用逗号分开就行了,也不需要写成如下形式:
[in] int Num1, [in] int Num2, [out] int *result
这个[in],[out]是VS里面的,VS里面是设计成了复选框,直接点击的。
自己仿照上面的加法操作,将减法,乘法,除法,素数~~全部添加好。
需要注意的是,类参数时根据你自己的需要设定的,比如,你判断一个数字是不是素数,这时候只需要两个参数,一个传进来,一个表示传出结果。
第五步:实现类功能。类已经全部添加好了,我们现在实现一下类功能就OK了。
点击InterfaceSupportsErrorInfo可以进入实现页面,当然,你也可以直接点击CCalcMath.cpp
第六步:分别实现 Add(), Sub(),Mul(), Div(),Sushu() 加,减,乘,除,素数这4个函数的功能:
下面是全部实现代码,其实就添加了几行代码~~~你只需要看着四个函数里面添加的内容就行了。
因为下面的代码,很多是类向导自动生成的。
// CalcMath.cpp : Implementation of CCalcSvrApp and DLL registration.
#include "stdafx.h"
#include "CalcSvr.h"
#include "CalcMath.h"
#include <math.h>
/////////////////////////////////////////////////////////////////////////////
//
STDMETHODIMP CCalcMath::InterfaceSupportsErrorInfo(REFIID riid)
{
static const IID* arr[] =
{
&IID_ICalcMath,
};
for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
{
if (InlineIsEqualGUID(*arr[i],riid))
return S_OK;
}
return S_FALSE;
}
STDMETHODIMP CCalcMath::Add(double Num1, double Num2, double *result)
{
// TODO: Add your implementation code here
*result = Num1 + Num2;
return S_OK;
}
STDMETHODIMP CCalcMath::Sub(double Num1, double Num2, double *result)
{
// TODO: Add your implementation code here
*result = Num1 - Num2;
return S_OK;
}
STDMETHODIMP CCalcMath::Mul(double Num1, double Num2, double *result)
{
// TODO: Add your implementation code here
*result = Num1 * Num2;
return S_OK;
}
STDMETHODIMP CCalcMath::Div(double Num1, double Num2, double *result)
{
// TODO: Add your implementation code here
if (Num2 != 0)
*result = Num1 / Num2;
return S_OK;
}
STDMETHODIMP CCalcMath::Sushu(int Num, int *result)
{
// TODO: Add your implementation code here
int i = 0;
for(i = 2; i <= sqrt(Num); i++) //记得加上 #include <math.h>
{
if((Num % i) == 0)
{
*result = 0; //0表示非素数
break;
}
}
if (i > sqrt(Num))
*result = 1; //1表示是素数
return S_OK;
}第七步:编译->链接。好了,我们的服务器端已经编写好了。
这时候,你在工程目录下面的Debug里面会看到CalcSvr.dll,同时注意上面的路径,因为你现在要手动注册CalcSvr.dll
第八步:注册CalcSvr.dll。
调出dos窗口。你可以按住win+R呼出运行,或者直接在开始栏里面点击运行,然后输入 cmd
执行注册的时候,需要注意.dll的路径
首先,进入dll所在的那个磁盘,如我的在E盘,则输入如下:
E:
然后进入相应的文件夹,cd表示进入该文件夹~,输入如下命令:
cd Ock\CalcSvr\Debug
服务器端,我们已经编写好了,下面我们来编写客户端。
这里就不用MFC了,为了简洁明了起见,直接创建一个win32控制台应用程序。win32控制台应用程序具体创建不说了,只要写过Hello World的都会。
下面编写客户端应用程序。
第一步:win32控制台应用程序 工程命名为 CalcClient,然后创建C++ Source File的时候也命名为:CalcClient.cpp。
第二步:将开始我们编写服务器端的时候,工程目录下的CalcSvr.h 和 CalcSvr_i.c两个文件拷贝过来,放在客户端工程目录下面。
第三步:在CalcClient.cpp里面,编写客户端具体实现代码。
#include <windows.h>
#include <iostream>
#include "CalcSvr.h"
#include "CalcSvr_i.c"
using namespace std;
template< class T > //函数模板
void show( T t )
{
cout << t << endl;
}
void DCOM()
{
double data = 0.0;
int flag = 0;
double a = 0.0, b = 0.0;
//初始化COM库
HRESULT hr=::CoInitialize(NULL); //用来告诉Windows以单线程的方式创建COM对象
if( !SUCCEEDED( hr ) )
{
show( "init right failed!" );
}
ICalcMath *plRF = NULL;
hr=::CoCreateInstance(CLSID_CalcMath,NULL,CLSCTX_INPROC_SERVER,IID_ICalcMath,(LPVOID *)&plRF);//用指定的类标识符在本地创建一个未初始化的COM对象
if(FAILED(hr))
{
cout<<"创建组件实例失败"<<endl;
}
//调用方法
cout<<"请选择:1.加;2.减;3.乘;4.除;5.判断素数(注:1表示素数;0表示非素数);0.退出\n__\b\b";
cin>>flag;
while(flag!=0)
{
switch(flag)
{
case 1:
{
cout<<"请输入要相加的两个数字:" ;
cin>>a>>b;
plRF->Add(a,b,&data);
cout<<"计算结果为:";
show( data );
break;
}
case 2:
{
cout<<"请输入要相减的两个数字:" ;
cin>>a>>b;
plRF->Sub(a,b,&data);
cout<<"计算结果为:";
show( data );
break;
}
case 3:
{
cout<<"请输入要相乘的两个数字:" ;
cin>>a>>b;
plRF->Mul(a,b,&data);
cout<<"计算结果为:";
show( data );
break;
}
case 4:
{
cout<<"请输入要相除的两个数字:" ;
cin>>a>>b;
if (b-0<1e-5 || 0-b>1e-5)
{
cout<<"除数不能为0\n";
break;
}
plRF->Div(a,b,&data);
printf("计算结果为:");
show( data );
break;
}
case 5:
{
cout<<"请输入要进行判断的数字:" ;
cin>>a;
plRF->Sushu((int)a,(int *)&data);
cout<<"判断结果为:";
show( data );
break;
}
case 0:break;
default:break;
}
system("pause");
system("cls");
cout<<"请选择:1.加;2.减;3.乘;4.除;5.判断素数(注:1表示素数;0表示非素数);0.退出\n__\b\b";
cin>>flag;
}
plRF->Release();
CoUninitialize(); //CoUninitialize关闭当前线程的COM库,卸载线程加载的所有dll,释放任何其他的资源,关闭在线程上维护所有的RPC连接。
}
int main()
{
DCOM();
return 0;
}
/*
ps:
//#define _WIN32_DCOM //#if (_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM) // DCOM
*/第四步:编译->链接->运行。
参考文献:qipanlimingCSDN博客的专栏,COM/DCOM开发练习之进程内组件实例,http://blog.csdn.net/lican19911221/article/details/7459983,2014年5月13日
COM/DCOM开发练习之进程内组件实例,布布扣,bubuko.com
标签:style blog class code c tar
原文地址:http://blog.csdn.net/qingdujun/article/details/25722717