DCOM+ACTIVEX的简单通信测试程序

 

【实验方案设计】

 

服务器端用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->SettingPost-build step中写入命令:

start/wait nmakef 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服务器”

    

 

 

   

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值