社区
ATL
帖子详情
救急!在DCOM如何获取客户端创建对象的指针?(解决问题另开贴送200分!跟贴有分!)
librastar2001
2005-06-13 08:42:48
用ATL建立的DCOM,我想在COM服务的主控程序中,处理每一个客户端创建的对象实例,
而且可以在COM服务的主控程序中调用这些对象实例的接口或者方法。
记录客户端指针的列表的结构可以自定义。
请问用什么方法?救急!最好提供代码或完整例程!
QQ:327139
...全文
277
19
打赏
收藏
救急!在DCOM如何获取客户端创建对象的指针?(解决问题另开贴送200分!跟贴有分!)
用ATL建立的DCOM,我想在COM服务的主控程序中,处理每一个客户端创建的对象实例, 而且可以在COM服务的主控程序中调用这些对象实例的接口或者方法。 记录客户端指针的列表的结构可以自定义。 请问用什么方法?救急!最好提供代码或完整例程! QQ:327139
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
帮顶一下..
D
COM
在远程系统中的使用
D
COM
(
分
布式组件对象模型)是微软的一个概念和程序接口,通过D
COM
,
客户端
程序对象能够向网络中的另一台计算机上的服务器程序对象发
送
请求 通过本地D
COM
执行命令 1,
获取
D
COM
程序列表 Get-CimInstance (适用于...
D
COM
(
分
布式组件对象模型)以及
分
布式应用
(
分
布式组件对象模型)是一系列微软的概念和程序接口,利用这个接口,
客户端
程序对象能够请求来自网络中另一台计算机上的服务器程序对象。D
COM
基于组件对象模型(
COM
),
COM
提供了一套允许同一台计算机上的
客户端
和...
D
COM
服务端及
客户端
指定用户访问的安全设置
前言:对于
分
布式组件,在创建组件过程中常因权限问题导致出现“拒绝访问”,无法创建组件对象或使用接口。本人水平有限,只能谈些个人经验和体会,希望能抛砖引玉! 有两种方法能使得D
COM
组件顺利创建和...
事件ID:10005 D
COM
错误的解决办法
这几天总是感觉我的windowsxp系统有问题,系统经常假死,刚开始以为是中毒,但是用杀软扫描没有发现异常。而今天更是出现了蓝屏,重启后我打开eventvwr然后点系统,查看发现一大堆错误,细看发现错误均来源于D
COM
,...
如何解决令人头痛的D
COM
配置问题
有不少刚刚接触OPC通信的技术人员因为不熟悉D
COM
配置倒在了OPC通信的“第一步”,那我们接下来就来看看如何完成令人头痛的D
COM
配置。
ATL
3,245
社区成员
48,539
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章