用VC++编写DCOM程序以及DCOM的配置方法.docx
- 文档编号:10511297
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:13
- 大小:160.70KB
用VC++编写DCOM程序以及DCOM的配置方法.docx
《用VC++编写DCOM程序以及DCOM的配置方法.docx》由会员分享,可在线阅读,更多相关《用VC++编写DCOM程序以及DCOM的配置方法.docx(13页珍藏版)》请在冰点文库上搜索。
用VC++编写DCOM程序以及DCOM的配置方法
怎样用VC++编写DCOM程序
于玲2001.2.10
一、建立服务器程序:
1、用VC++建立一个名为Test的workspace。
2、在workspace中加入一个新的工程,选ATLCOMAppwizard项,命名为AddSub,下一步server类型选service(EXE)。
3、添加组件对象:
打开Insert\NewATLObject,选SimpleObject,在names下shortname填AddSubCom,如果需要可以将interface改为IAdd(默认为IAddSub),在attributes下interface选custom,则该com组件接口将从IUnknown继承,如果aggregation选yes,则该组件可被聚合。
4、a)组件接口函数的定义:
打开AddSub.idl文件,在接口IAdd下填写接口函数的声明:
interfaceIAdd:
IUnknown{
//接口函数的声明
HRESULTAddMatrix([in]intlength,
[in,size_is(length)]double*pfMatrix,
[in,size_is(length)]double*psMatrix,
[out,size_is(length)]double*prMatrix);
};
另一种方法是:
在workspace的class标签中,右键点击IAdd,选AddMethod,在对话框中添加。
b)组件接口函数的声明(如果在上一步中使用第二种方法添加,则无需此步):
打开AddSubCom.h文件,在类声明后面加入:
STDMETHOD(AddMatrix)(intlength,double*pfMatrix,double*psMatrix,double*prMatrix);
c)组件接口函数的实现:
打开AddSubCom.cpp文件,加入接口方法的实现函数:
STDMETHODIMPCAddSubCom:
:
AddMatrix(intlength,double*pfMatrix,double*psMatrix,double*prMatrix)
{
//函数功能
returnNOERROR;
}
5、组件注册:
一般地,编译完成服务器自动注册;如果使用编译好的服务器,注册方法是用/Register参数执行服务器程序,如C:
\MyDir\AddSub/RegServer,解注册用/UnregServer(参见AddSub.cpp源码)。
二、建立代理/存根DLL
1、建立一个新的工程命名为PSAddSub,工程选Win32Dynamic-LinkLibrary,其余默认。
2、在工程中新建一个文本文件PSAddSub.def,内容如下:
LIBRARYPSAddSub
EXPORTS
DllGetClassObjectPRIVATE
DllCanUnloadNowPRIVATE
DllRegisterServerPRIVATE
DllUnregisterServerPRIVATE
GetProxyDllInfoPRIVATE
3、将AddSub.idl生成的AddSub.h、AddSub_i.c、AddSub_p.c、dlldata.c四个文件加入工程。
4、project\setting\c/c++中category\Preprocessordefinitions加入REGISTER_PROXY_DLL,_WIN32_DCOM,project\setting\link中Object/librarymodules加入rpcndr.librpcns4.librpcrt4.lib,然后编译,生成PSAddSub.dll。
5、注册dll:
c:
\MyDir>regsvr32PSAddSub.dll;也可以用VC++的tools\RegisterControl。
⏹dictionary.h——包含接口说明的头文件,可用于C或者C++语言;
⏹dictionary_p.c——该C文件实现了接口IDictionary的代理和存根;
⏹dictionary_i.c——该C文件定义了IDL文件中用到的所有全局描述符GUID,包括接口描述符;
⏹dlldata.c——该C文件包含代理/存根程序的入口函数以及代理类厂所需要的数据结构等。
三、建立客户程序
在客户端主程序中加入如下程序段:
#include
#include
#include
#include"../Server/Server.h"
intmain()
{
CString*pszHostName=newCString("125.223.8.77");
//char*pszHostName="125.223.8.77";
//pszHostName=;
HRESULThResult;
//PrepareCOMforuse
hResult=CoInitialize(NULL);//初始化COM库
if(FAILED(hResult)){
return0;
}
IClassFactory*pClf;
IUnknown*pIUnknown;
LPOLESTRlpszHostname=pszHostName->AllocSysString();
COSERVERINFOServerInfo={0,lpszHostname,NULL,0};//获取服务器信息
hResult=CoGetClassObject(CLSID_AddSubCom,
CLSCTX_SERVER,
&ServerInfo,
IID_IClassFactory,
(void**)&pClf);//创建类厂
if(FAILED(hResult)){
return0;
}
hResult=pClf->CreateInstance(NULL,
IID_IUnknown,
(void**)&pIUnknown);//创建组件对象
if(FAILED(hResult)){
pClf->Release();
return0;
}
pClf->Release();//释放类厂
IAddSubCom*pIAddMatrix;
hResult=pIUnknown->QueryInterface(IID_IAddSubCom,(void**)&pIAddMatrix);//查询接口
if(FAILED(hResult)){
pIUnknown->Release();
return0;
}
//callfunction
doublepfSubMatrix[10],psSubMatrix[10],prSubMatrix[10];
for(inti=0;i<10;i++)
{
pfSubMatrix[i]=i;
psSubMatrix[i]=i;
}
intSubMatrixLength=10;
pIAddMatrix->AddMatrix(SubMatrixLength,pfSubMatrix,psSubMatrix,prSubMatrix);//调用接口函数
pIAddMatrix->Release();
//wehavedonewiththeIAddMatrixinterface
//We'redonewiththeMatrixobject
pIUnknown->Release();
pIUnknown=NULL;
CoUninitialize();//释放COM库
for(i=0;i printf("%f\t",prSubMatrix[i]); printf("\n"); return0; } 客户端工程必须包含AddSub.h和AddSub_i.c文件,对于AddSub_i.c文件project\setting\c/c++中PrecompiledHeaders应选Automaticuseofprecompiledheaders。 注意: 在客户端,无论编写debug还是release程序,project\setting\c/c++中的codegeneration下的Userun-timelibrary应选DEBUGMultithreadedDLL。 四、客户调用服务器 客户可以远程调用服务程序,代理/存根DLL必须在两端都有副本,并且注册,这样客户就可以通过代理/存根DLL调用远端的服务器了。 五、易出现的错误: C: \…\AddSubSvr.cpp(8): fatalerrorC1852: 'ReleaseMinDependency/AddSubSvr.pch'isnotavalidprecompiledheaderfile Errorexecutingcl.exe. 解决: 对于AddSubSvr.cpp文件,project\setting\c/c++中PrecompiledHeaders应选Automaticuseofprecompiledheaders。 此错误易在从新编译时出现。 Linking... LIBC.lib(crt0.obj): errorLNK2001: unresolvedexternalsymbol_main ReleaseMinDependency/MutSvr.exe: fatalerrorLNK1120: 1unresolvedexternals Errorexecutinglink.exe. 解决: 对于MutSvr工程,project\setting\c/c++中Preprecessordefinitions,将_ATL_MIN_CRT删去。 #include #include #include #include"../Server/Server.h" usingnamespacestd; typedefstructtarParam { charip[20]; double*coe; longpower; doublea; doubleb; doubleeps; doubleroot; intresult; }param; DWORDWINAPIrun(LPVOIDpParams) { param*pp=(param*)pParams; HRESULThResult; hResult=CoInitialize(NULL);//初始化COM库 if(FAILED(hResult)){ return0; } IClassFactory*pClf; IUnknown*pIUnknown; wchar_tip[42]; intlen=strlen(pp->ip); mbstowcs(ip,pp->ip,len);//转换单字符串为宽字符串 ip[len]=0;//设置字符串结尾 COSERVERINFOServerInfo={0,ip,NULL,0};//获取服务器信息 hResult=CoGetClassObject(CLSID_Polynomial, CLSCTX_SERVER, &ServerInfo, IID_IClassFactory, (void**)&pClf);//创建类厂 if(FAILED(hResult)){ return0; } hResult=pClf->CreateInstance(NULL, IID_IUnknown, (void**)&pIUnknown);//创建组件对象 if(FAILED(hResult)){ pClf->Release(); return0; } pClf->Release();//释放类厂 IPolynomial*pIPolynomial; hResult=pIUnknown->QueryInterface(IID_IPolynomial,(void**)&pIPolynomial);//查询接口 if(FAILED(hResult)){ pIUnknown->Release(); return0; } unsignedlongtime=GetTickCount(); //调用接口函数 pp->result=pIPolynomial->polynomial_root(pp->coe,pp->power,pp->a,pp->b,pp->eps,&pp->root); /* if(pp->result){ cout< : fixed)< } else cout<<"notfound! "< */ pIPolynomial->Release(); pIUnknown->Release(); pIUnknown=NULL; CoUninitialize();//释放COM库 return0; } intmain() { ifstreaminfile("ip.txt",ios: : in); charip[20][20]={'\0'}; parammachine[20]; intnum; intparallelNum; inti=0; HANDLEMThread[20]; //读取服务器IP地址 do{ infile>>machine[i].ip; }while(strlen(machine[i].ip)>5&&i++<20); num=i; if(num>0) cout<<"当前的处理机有"< "< i=0; while(i cout< cout<<"请输入并行的处理机数: "; cin>>parallelNum; if(parallelNum>num)//输入的并行数大于处理机数 return-1; i=0; doublecoe[]={10,1,2,3,4,5,6,7}; unsignedlongparallel_time=GetTickCount(); doublea=-1000; doubleb=1000; doublestep=(b-a)/parallelNum; while(i { machine[i].coe=coe; machine[i].power=7; machine[i].a=-1000+i*step; machine[i].b=-1000+(i+1)*step; machine[i].eps=1e-10; machine[i].root=0; machine[i].result=0; MThread[i]=CreateThread(0,0,run,(LPVOID)&machine[i],0,NULL);//结构体数组pp的参数传送 i++; } unsignedlongw1=WaitForMultipleObjects(parallelNum,MThread,TRUE,INFINITE); if(w1==WAIT_OBJECT_0) { //"所有线程执行结束"; for(i=0;i { : : CloseHandle(MThread[i]); } } parallel_time=GetTickCount()-parallel_time; cout<<"并行时间为: "< for(i=0;i { cout< : fixed)< (2)< } return0; } 运行—>gpedit.msc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 编写 DCOM 程序 以及 配置 方法
![提示](https://static.bingdoc.com/images/bang_tan.gif)