【实验方案设计】
服务器端用DCOM实现,客户端用ACTIVEX实现一个能嵌入网络的控件。
【实验过程】(实验步骤、记录、数据、分析)
1. 创建 DCOM 组件
1.1 打开 VC6 ,首选创建一个 ATL 工程 DComServer 。这里选择的service类型
1.2 添加一个 ATL 组件(insert->new ATL object->simple object),取名 Server ,添加一个接口方法GetInfo()。实现方法如下:
STDMETHODIMP CServer::GetInfo(BSTR * pbstrInfo)
{
// TODO: Add your implementation code here
if (pbstrInfo)
{
* pbstrInfo = SysAllocString(L " 你好,这里是DCOM服务器! " );
}
return S_OK;
}
1.3 生成存根
在setting中进行工程设置。
Project->Setting中Post-build step中写入命令:
start/wait nmake–f DcomServerps.mk // 创建存根
regsvr32 DcomServer.dll //注册DLL文件
1.4 编译运行
系统自动生成DLL文件,该DLL文件即为存根。输入dcomcnfg命令,可以查找到DcomServer服务。
2 创建客户端测试控件
2.1 新建一个MFC ACTIVEX项目。
2.2 初始化COM库
在BOOL CClientApp::InitInstance()中添加
CoInitialize(NULL); //初始化COM库
2.3 在StdAfx.h头文件中,添加如下引用
#include <OBJBASE.H>
#include <ATLCONV.H>
#include ".../DComServer.h" //输入你自己的DCOM SERVER的路径
在StdAfx.cpp中,包含如下头文件
#include "../DComServer/DComServer_i.c"
2.4 添加对服务器接口指针
在控件control类的头文件中声明指针
IServer* m_pIServer; // 接口指针
2.4 为控件接口(DcClient)添加两个方法:Connect和getMessage
void CClientCtrl::Connect()
{
// TODO: Add your dispatch handler code here
COSERVERINFO serverInfo;
MULTI_QI multiQi = {&IID_IServer, NULL, NOERROR};
HRESULT hr = NOERROR;
// 如果已经连接上
if(m_pIServer)
{
//m_pIServer->Release();
m_pIServer = NULL;
}
ZeroMemory(&serverInfo, sizeof(COSERVERINFO));
CString m_strServer="***.***.***.***";//输入服务器所在IP地址
serverInfo.pwszName = m_strServer.AllocSysString();
MessageBox(m_strServer);
// 创建远程组件
hr = CoCreateInstanceEx(
CLSID_Server,
NULL,
CLSCTX_REMOTE_SERVER,
&serverInfo,
1,
&multiQi);
// 释放字符串指针
SysFreeString(serverInfo.pwszName);
if(SUCCEEDED(hr))
{
m_pIServer = (IServer*)multiQi.pItf;
AfxMessageBox(_T("连接成功!"));
}
else
{
AfxMessageBox(_T("连接失败!"));
}
}
void CClientCtrl::GetMessage()
{
// TODO: Add your dispatch handler code here
BSTR bstrInfo;
USES_CONVERSION;
if(m_pIServer)
{
m_pIServer->GetInfo(&bstrInfo);
AfxMessageBox(W2A(bstrInfo));
}
else
{
AfxMessageBox(_T("请连接DCOM服务!"));
}
}
3.运行
编译之后,系统注册了DCOM的SERVER和CLIENT的控件。在服务器端打开sever.exe。让服务器运行。
客户端编写如下测试页面,将控件嵌入网页运行。(也可直接在VC 6.0下选择AXTIVEX 测试工具进行测试)
<html>
<head>
<title></title>
</head>
<body>
//找到控件的控制类CLIENTCTRL的UID,
<object id=client classid= "clsid:XXX-XX-XX-XX-XX">
</object>
<script language ="javascript">
function Change()
{
try
{
client.Connect();
client.GetMessage();
}
catch(e)
{alert(e);}
}
</script>
<form name="form" method="post">
<input name="change" type="submit" οnclick=" Change()" />
</form>
</body>
程序运行成功。页面上弹出“您好,DCOM服务器”