奇怪的问题,二十万火急,COM高手help!!!!!!!!(最后70分,不要嫌少啊)

yx_mmcall 2002-06-20 06:11:02
小弟我的系统结构是这样的:

服务器端:VC WIN2000

虚基类->底层类->管理类->ATL(DCOM ,进程外)=组件。
其中,底层类由虚基类继承而来,管理类负责调用底层类对象。

客户端:VB WIN2000

myObject=CreateObject(组件名,服务器名)
'------执行完这里,可以看见产生组件的进程。
'------如果此时结束程序,一切正常。
………………
myObject.init '调用组件程序里的实例化底层类 ( new 底层类)
'------执行完这里,结束程序,组件的进程无法结束!!!

除了退出没有结束组件进程这个问题,其他工作一切正常。

客户端程序退出时调用了set Object=Nothing。
但服务器端管理类析构的时候没有delete 底层类对象(若的delete会出错!!??)。

到底问题出在哪里?该不该delete 由虚基类继承来的底层类?
如果需要,应该怎样delete?

各位前辈快救救我吧!!!
...全文
37 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
yx_mmcall 2002-06-24
  • 打赏
  • 举报
回复
终于搞定了!!!

我把
class ATL_NO_VTABLE CTDS654C :
public CComObjectRootEx<CComSingleThreadModel>

改为:
class ATL_NO_VTABLE CTDS654C :
public CComObjectRootEx<CComMultiThreadModel>

stdafx.h:
#define _ATL_APARTMENT_THREADED
to:
#define _ATL_FREE_THREADED

一切ok了!!!!!


一切ok!!!!
yx_mmcall 2002-06-24
  • 打赏
  • 举报
回复
我找不到有关资料,
您能说详细一点吗?
yx_mmcall 2002-06-23
  • 打赏
  • 举报
回复
1、没有自己引用自己
2、在delete m_pManager 前写delete m_pManger.m_pObject,
同样出错!

究竟是怎么回事?
acptvc 2002-06-23
  • 打赏
  • 举报
回复
>>但是组件的进程还是没有结束啊!!!究竟是怎么回事儿?
不知道我是否看懂了你的问题。DCOM DLL的lifetime有client管理,当client退出时候(调用CoFreeUnusedLibraries),DLL也会根居自身DllCanUnloadNow()决定是否退出。
但是DCOM EXE Server的lifetime跟client通常不绑定,有其自己的一套管理方式。建议你看看《Inside ATL》"Server lifetime management"。重点还是看void CExeModule::MonitorShutdown()


〉ASP好像是这样的,调用后就不释放了,可能跟它后期绑定有关吧,而且ASP
>好像有自己的一套封装环境(我对ASP陌生得很,不一定清楚)。
>我现在也碰到了这种事,头疼的很,只要一次调用非得重启,否则不能继续
>更新组件。
如果你的ASP 程序有名字的话,可以使用IIS中的Unload功能将你的component从IIS中卸载出来。

ASP.NET中就好多了,使用shadow copy允许runtime更新你的component而不必停下你的web site.


- 微软全球技术中心 VC技术支持

本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款
(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。
为了为您创建更好的讨论环境,请参加我们的用户满意度调查
(http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。
yx_mmcall 2002-06-23
  • 打赏
  • 举报
回复
up
yx_mmcall 2002-06-23
  • 打赏
  • 举报
回复
终于delete m_pObject 成功。
但是组件的进程还是没有结束啊!!!

究竟是怎么回事儿?
programcat2001 2002-06-22
  • 打赏
  • 举报
回复
大家帮忙看一下这个:
http://www.csdn.net/expert/topic/822/822284.xml?temp=.7585108
yx_mmcall 2002-06-21
  • 打赏
  • 举报
回复
客户端调用请看前文

我的服务器部分:

组件接口部分:
STDMETHODIMP CObject::Init(long Idx, long *ret)
{
*ret=m_pManager->Init(Idx);

return S_OK;
}

m_pManager实现部分:

CManager::Init(int Idx)
{
m_pObject=new 底层类(Idx)
}

class 底层类:virtual 虚基类

一旦客户端调用了
CObject::Init,退出程序时服务器的组件进程就无法正常结束。
要是我不调用CObject::Init,立刻结束程序就一切正常!

我的析构部分

~CObject()
{
delete m_pManager;
}

~CManager()
{
//delete m_pObject; //……此处一但delete 就会报错
//我怀疑就是这里没有清除m_pObject造成的
//但是应该怎样去delete 呢?
}

请帮帮我,在线等待中………………


maphis 2002-06-21
  • 打赏
  • 举报
回复
arxing(阿行),找个kill.exe程序,在resource kit中有,kill就行了,再不行用-f参数,我一直这么用的,方便得很。
arxing 2002-06-21
  • 打赏
  • 举报
回复
mmcall (),你的术语我不大懂,可不可以再表达一遍?
arxing 2002-06-21
  • 打赏
  • 举报
回复
dllhost.exe无法手工关闭,我的系统是windows2000 Advance Server.
yx_mmcall 2002-06-21
  • 打赏
  • 举报
回复
各位前辈,能不能考虑考虑我的问题啊,在线等待中……………………
maphis 2002-06-21
  • 打赏
  • 举报
回复
阿行,ASP的确是这样的,不释放,为了提高效率。不过你似乎也不用重启。你可以把IIS设置中的Application设置成middle(中),然后IIS会把该组件调入dllhost.exe,你只要kill这个dllhost.exe就行啦,不用重启那么麻烦,花时间。
yx_mmcall 2002-06-21
  • 打赏
  • 举报
回复
我没有用ASP啊
Lostinet 2002-06-21
  • 打赏
  • 举报
回复
肯定是自己引用了自己,自己由没有释放。
volcary 2002-06-21
  • 打赏
  • 举报
回复
你的m_pobject 不会就是 CObject吧,
如果不是的化在delete m_pManager 前写
delete m_pManger.m_pObject,
不在~CManager()中DELETE
最好帖出完整代码,看看你的类的定义
yx_mmcall 2002-06-21
  • 打赏
  • 举报
回复
arxing 2002-06-20
  • 打赏
  • 举报
回复
ASP好像是这样的,调用后就不释放了,可能跟它后期绑定有关吧,而且ASP好像有自己的一套封装环境(我对ASP陌生得很,不一定清楚)。
我现在也碰到了这种事,头疼的很,只要一次调用非得重启,否则不能继续更新组件。暂时发现如果把它放在组件管理器,可以避免这种麻烦,可是这样也不是理想的解决办法,因为一旦这样的话,就跟COM+环境封装联系上了,不能自己实现自定义构造组件,自定义线程环境等东西了。
我也希望有哪位高手帮帮忙:(
yx_mmcall 2002-06-20
  • 打赏
  • 举报
回复
和其他的一样,没有什么特殊的
Lostinet 2002-06-20
  • 打赏
  • 举报
回复
Init那里的引用记数是不是弄错了?另自己不能正常释放???
加载更多回复(1)

3,248

社区成员

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

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