救急!在DCOM如何获取客户端创建对象的指针?(解决问题另开贴送200分!跟贴有分!)

librastar2001 2005-06-13 08:42:48
用ATL建立的DCOM,我想在COM服务的主控程序中,处理每一个客户端创建的对象实例,
而且可以在COM服务的主控程序中调用这些对象实例的接口或者方法。
记录客户端指针的列表的结构可以自定义。
请问用什么方法?救急!最好提供代码或完整例程!
QQ:327139
...全文
277 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
laker_tmj 2005-06-15
  • 打赏
  • 举报
回复
up learn
librastar2001 2005-06-15
  • 打赏
  • 举报
回复
Deleting intermediate files and output files for project 'Server - Win32 Debug'.
--------------------Configuration: Server - Win32 Debug--------------------
Creating Type Library...
Microsoft (R) MIDL Compiler Version 5.01.0164
Copyright (c) Microsoft Corp 1991-1997. All rights reserved.
Processing C:\Documents and Settings\LIUYT\桌面\DCOMRetrieveIUk\DCOMRetrieveIUk\Server\Server.idl
Server.idl
Processing C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\oaidl.idl
oaidl.idl
Processing C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\objidl.idl
objidl.idl
Processing C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\unknwn.idl
unknwn.idl
Processing C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\wtypes.idl
wtypes.idl
Processing C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\ocidl.idl
ocidl.idl
Processing C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\oleidl.idl
oleidl.idl
Processing C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\servprov.idl
servprov.idl
Processing C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\urlmon.idl
urlmon.idl
Processing C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\msxml.idl
msxml.idl
Compiling resources...
Compiling...
StdAfx.cpp
Compiling...
Obj.cpp
c:\program files\microsoft visual studio\vc98\include\xstring(525) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify -GX
c:\program files\microsoft visual studio\vc98\include\xstring(521) : while compiling class-template member function 'void __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Copy(unsigned int)'
Server.cpp
c:\program files\microsoft visual studio\vc98\include\xstring(525) : warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify -GX
c:\program files\microsoft visual studio\vc98\include\xstring(521) : while compiling class-template member function 'void __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Copy(unsigned int)'
Generating Code...
Linking...
Server.obj : error LNK2005: "class std::vector<class CObj *,class std::allocator<class CObj *> > m_listClient" (?m_listClient@@3V?$vector@PAVCObj@@V?$allocator@PAVCObj@@@std@@@std@@A) already defined in Obj.obj
Debug/Server.exe : fatal error LNK1169: one or more multiply defined symbols found
Error executing link.exe.

Server.exe - 2 error(s), 2 warning(s)
sinall 2005-06-15
  • 打赏
  • 举报
回复
本版搜索“线程”会有不少讨论。
librastar2001 2005-06-15
  • 打赏
  • 举报
回复
恩,你的方法不错,可是我如果在服务器主控线程中就无法回调客户端,因为在不同线程空间中.这个问题有办法解决吗?
老夏Max 2005-06-14
  • 打赏
  • 举报
回复
还是看看ATL的源代码,相关的接口都有实现的类,看看它们是怎么保存实例指针的!
librastar2001 2005-06-14
  • 打赏
  • 举报
回复
怎么在服务器端用全局变量记录每一个对象实例的指针?
librastar2001 2005-06-14
  • 打赏
  • 举报
回复
问题就是怎么记录对象实例指针?
sinall 2005-06-14
  • 打赏
  • 举报
回复
注意:DCOM中Client创建的实例存在于Server端空间。
如果你现在已经可以处理一个Client的情况,那么按照我上面的方法应该可行。
(如果没有,建议你先处理一个客户端的情况)

其实,总体思想就两条:
1、服务端存在一个全局型变量,用以记录已经注册的客户端。
2、客户端可以将自己注册到服务器端。
newcore 2005-06-14
  • 打赏
  • 举报
回复
冒着关灯的危险发最后一贴...

to sinall斑竹,你是用连接点实现的.我想问问,你的demo服务端是用的dll还是exe?

如果是exe服务器,给偶看看NewCore22@163.com
谢了
librastar2001 2005-06-14
  • 打赏
  • 举报
回复
需要!就是这个问题,我用得你的方法编译怎么不通过?
liuyt1017@hotmail.com
librastar2001 2005-06-14
  • 打赏
  • 举报
回复
楼上各位,我的意思是在DCOM的主控程序中记录每一个客户端申请的实例,然后回调指定的客户端。
sinall 2005-06-14
  • 打赏
  • 举报
回复
楼上两位说得对。
我的办法确实有问题。
考虑在客户端列集后传递IStream指针。
void InsertObj(IStream *pStm);

另,可以考虑在类的构造函数里直接保存其自身指针。这个办法应该好一些。
newcore 2005-06-14
  • 打赏
  • 举报
回复
恩,楼上说的有道理

sinall斑竹的方法好象不行,虽然没有试过,但是在DCOM中这样直接传递实例指针估计后果很严重...
xiaqq 2005-06-14
  • 打赏
  • 举报
回复
学习一下!
理论上对象的指针都是在Server这边创建的,当然应该有办法获得其指针。但是因为是DCOM,所以Client的指针肯定不能代表Server端的指针。也许看看ATL的源代码就可以找到答案了。呵呵
sinall 2005-06-14
  • 打赏
  • 举报
回复
不知可行否:
1、COM类定义
static vector<IUnknow*> m_objList;
void InsertObj(IUnknow *pUK);
2、在每个客户端CreateInstance后,调用InsertObj将IUnknow插入到m_objList中。
sinall 2005-06-14
  • 打赏
  • 举报
回复
我做了个例子:某一客户调用对象方法时,服务器将回调各个客户端的方法。
1、在修改类如下:
#include <VECTOR> //添加
using namespace std; //添加

class CObj; //添加
vector<CObj *> m_listClient; //添加
/////////////////////////////////////////////////////////////////////////////
// CObj
class ATL_NO_VTABLE CObj :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CObj, &CLSID_Obj>,
public IConnectionPointContainerImpl<CObj>,
public IDispatchImpl<IObj, &IID_IObj, &LIBID_SERVERLib>,
public CProxy_IObjEvents< CObj >
{
public:
CObj()
{
m_listClient.push_back(this); //添加
}

2、在接口的某个方法实现中:
for(vector<CObj *>::iterator i=m_listClient.begin();i!=m_listClient.end();i++)
{
CObj *pObj=(CObj *)*i;
pObj->Fire_cbFunc01(); //触发回调函数
}

3、客户端(VB)
Option Explicit

Private WithEvents client1 As Obj
Private WithEvents client2 As Obj

Private Sub client1_cbFunc01()
MsgBox "client1"
End Sub

Private Sub client2_cbFunc01()
MsgBox "client2"
End Sub

Private Sub Command1_Click()
client1.Func01
End Sub

Private Sub Form_Load()
Set client1 = New Obj
Set client2 = New Obj
End Sub

另:
如需完整例子,发消息给我,留下E-Mail,并说明需要哪个Demo
librastar2001 2005-06-14
  • 打赏
  • 举报
回复

LPVOID* ppv=NULL;
int hRes;
_ATL_OBJMAP_ENTRY* pEntry = _Module.m_pObjMap;//从_Module中取出对象映射数组

while (pEntry->pclsid != NULL)
{
if ((pEntry->pfnGetClassObject != NULL) && InlineIsEqualGUID(CLSID_DataManager, *pEntry->pclsid))
{ ......}
pEntry ++;
}


理想情况下,我的这个while循环应该执行2次(我启动了两个客户端),为什么pEntry++后,pEntry->pclsid就为空了?而这时我明明看到_Module.m_nLockCnt=2啊?
sinall 2005-06-14
  • 打赏
  • 举报
回复
服务器端自己new了一个对象出来,难道保存这个对象的实例指针还有什么问题吗???
artmouse 2005-06-13
  • 打赏
  • 举报
回复
帮顶一下..

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧