欢迎来到天天文库
浏览记录
ID:20359593
大小:130.00 KB
页数:13页
时间:2018-10-12
《进程外组件的编写步骤》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、进程外组件实现在此创建一个名为Name.exe的服务器,该服务器包含一个COM类,该类带有一个用户接口Imachine。该接口只有一个方法Getname。该方法返回一个服务器所在计算机的主机名的字符串。在实现了服务器程序后,还要建立一个客户程序来对此服务器进行调用,调用的结果就显示服务器所在计算机的主机名的字符串。进程外组件的编写步骤进程外组件编写过程如下:1.使用ATLCOMAppWizard来创建新的工程Name。在第一步中为服务器类型选择Executable(EXE)。2.插入新的ATL对象的Machine。接收所有的默认名称。它的属性是单线程模式、用户接口和不使用聚合。3
2、.加入带有输出参数BSTR*pName的方法GetName。进程外组件4.用下列代码实现方法GetName。在此使用Win32函数GetComputerName和ATL包装类CComBSTR。STDMETHODIMPCMachine::GetName(BSTR*pName){//TODO:Addyourimplementationcodeherecharbuf[MAX_COMPUTERNAME_LENGTH+1];DWORDsize=MAX_COMPUTERNAME_LENGTH+1;::GetComputerName(buf,&size);CComBSTRbstr(buf);*
3、pName=bstr;returnS_OK;}进程外组件5.增加下面两个用户联编步骤,运行make文件以建立代理、存根程序DLL并对其进行注册。请看下页的图中所示的窗口。可以从菜单Project—Setting中启动下图的对话框。nmakeNameps.mkregsvr32Nameps.dll6.联编该工程。进程外组件调用进程外组件程序的编写客户程序的编写1.建立一个标准的MFCAppWizard(exe)工程。2.在引用程序类型中选择“D基本对话框”3.把刚才建立的服务器程序中的name.h和name_i.c复制到测试目录中。代码4.在按钮的单击事件中写代码如下:voidCNa
4、meTestDlg::OnGetname(){IMachine*pMachine;HRESULThr;hr=CoCreateInstance(CLSID_Machine,NULL,CLSCTX_SERVER,IID_IMachine,(void**)&pMachine);if(FAILED(hr)){MessageBox("CoCreateInstancefailed");return;}代码BSTRbstr;hr=pMachine->GetName(&bstr);if(FAILED(hr))MessageBox("GetNamefailed");else{_bstr_tname
5、(bstr,false);SetDlgItemText(IDC_NAME,(constchar*)name);}pMachine->Release();}代码voidCNameTestDlg::OnClear(){SetDlgItemText(IDC_NAME,"");}当然要在此文件的开始添加头文件如下:#include"stdafx.h"#include"NameTest.h"#include"NameTestDlg.h"#include"name.h"#include"name_i.c"#include前三个头文件是此文件中自己生成的要添加的就只有后三个
6、文件代码5.在对话框初始化函数中对OLE进行初始化,代码如下:BOOLCNameTestApp::InitInstance(){if(!AfxOleInit())AfxMessageBox(“AfxOleInitfailed”);returnFALSE;}运行客户程序6.编译客户端程序并运行,其显示窗口和结果如下:EXE服务器的文件服务器端的有关文件如下:name.regs注册脚本文件name.idl接口定义文件nameps.mk代理/存根程序的DLL的make文件下面文件是由MIDL编译器创建的:name.h接口定义name_i.c定义所有的GUIDname_p.c代理/存根程
7、序的实现代码dlldata.c接口参数的调度代码下面文件是在联编工程时创建的:name.tlb描述对象和其接口的二进制类型库name.exe服务器可执行文件nameps.dll代理/存根程序DLL
此文档下载收益归作者所有