哈哈,努力了几天,总算做出简单的DCOM程序了
开发环境VC6
虚拟机VirtualBox,虚拟机内地IP:192.168.1.108,
外192.168.1.244
本机IP:192.168.5.14
子网掩码都是255.255.255.240创建ATL COM AppWizard
插入ATL对象
选择Simple Object,单击Next如下图
在Short Name中输入DComtest
确定.
在接口中添加如下方法
Add
([in] long n1, [in] long n2, [out, retval] long *pVal)
方法中实现两个数相加
*pVal = n1 + n2;
按F7.
创建基于对话框的应用程序,名字为TestDcom
在StdAfx.h中加入#import "..\\Simple33/Simple33.tlb" no_namespace
在一个按钮事件中输入如下代码
CTestDcom::OnTest()
{
CLSID clsid;
IDComtest *dct = NULL;
COSERVERINFO ServerInfo={0,L"192.168.1.108",NULL,0};
MULTI_QI MultiQi = {&__uuidof(IDComtest),NULL,NOERROR};
CoInitialize(NULL);
HRESULT hr;
hr = CLSIDFromProgID(OLESTR("Simple33.DComtest"), &clsid);
if(FAILED(hr))
{
MessageBox("获取ID失败");
CoUninitialize();
}
// hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, __uuidof(IDComtest), (LPVOID*)&dct);
MultiQi.pItf = dct;
hr = CoCreateInstanceEx(clsid, NULL, CLSCTX_REMOTE_SERVER, &ServerInfo, 1, &MultiQi);
// CoGetClassObject(clsid, CLSCTX_REMOTE_SERVER, NULL, __uuidof(IDComtest), (LPVOID *)&dct);
dct = (IDComtest*)(MultiQi.pItf);
if(FAILED(hr))
{
MessageBox("创建失败");
CoUninitialize();
return ;
}
/*
if (dct == NULL);
{
MessageBox("接口指针错误");
return ;
}
*/
// dct = dct->QueryInterface(&__uuidof(IDComtest));
// ie->Advice(&sink.Fire_Result(5));
long adv = 0;
int ret;
ret = dct->Add(1, 2);
// dct->raw_Add(1, 2, &adv);
char buff[10] = {0};
itoa(ret, buff, 10);
// itoa(adv, buff, 10);
MessageBox(buff);
dct->Release();
dct = NULL;
CoUninitialize();
}
将Simple33.exe复制到虚拟机中
运行cmd
进入Simple33.exe的目录
Simple33 /RegServer注册
在本机中运行DCOMCNFG命令
找到”组件服务->计算机->我的电脑->DCOM配置->Simple33”,配置如下,只选择"在以下计算机中使用应用程序",输入IP:
192.168.1.108,确定
运行TestDcom.exe,运行结果