关于EXE程序内的自动化接口

土著巫师 2006-12-18 10:25:09
最近做了一个EXE程序,里面加了一个自动化接口供VB的程序调用,使用期间发现退出时有异常发生,初步检查下来发现: 当VB程序触发我的EXE程序起动时,我程序的主窗口的FormCreate事件和FormShow事件都正常执行,后面的通讯工作(有数据相互传输)也都正常,只是当VB的程序释放自动化接口后我的程序退出时FormCloseQuery和FormClose事件没有执行,要命的是FormDestroy事件也没有执行,直接导致我FormCreate事件里申请的资源得不到释放,生成的线程也得不到正常终止.不出问题才怪呢.闷.


附1: 如果我的程序主动起动后,其它程序再调用我EXE程序里的接口时发生错误(比如说这个程序有毛病系统直接结束了它的执行),这时候我的程序再主动关闭窗口退出时就会有一个COM Server Warning窗口弹出: There are still active COM object in this application. One or more clients have references to these objects, so manually closing this application may cause those client application(s) to fail.Are you sure you want to close this application?查了一下,相关源代码是写在自动化接口的模板里的,好象没有什么编译开关可以关闭它,不知道各位朋友是如何处理类似的事件的?

附2: 结了一个前两天的贴子,明明是给回贴朋友给了分,可是贴子结了后,却发现每个回贴后的得分为0分,闷.
http://community.csdn.net/Expert/TopicView3.asp?id=5224774
...全文
298 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
土著巫师 2006-12-19
  • 打赏
  • 举报
回复
关于附1:因是模板类,源代码都是写在头文件里的,每次编译时才链接进程序,所以直接打开atlmod.h头文件,找到:

template <class T>
bool __fastcall TATLModule<T>::AutomationTerminateProc()
{

if (_Module.GetLockCount() > 0)
{
return true; // 不管如何直接返回true.
//return ::MessageBoxA(0, (Comconst_SNoCloseActiveServer1 + Comconst_SNoCloseActiveServer2).c_str(),
// Comconst_SAutomationWarning.c_str(),
// MB_YESNO|MB_TASKMODAL|MB_ICONWARNING|MB_DEFBUTTON2) == IDYES;
}
else
// if there are no outstanding lock, it's OK to terminate
//
return true;
}

把对话框注释掉,加上return true,重新BUILD即可.
土著巫师 2006-12-18
  • 打赏
  • 举报
回复
CSDN真是牛,附2的贴子里的分数,不知道现在为什么又给上了.闷上加闷,当真出鬼了呀.
daydayup234 2006-12-18
  • 打赏
  • 举报
回复
我回答附2:
别介意,分我不要了^o^
yi10000 2006-12-18
  • 打赏
  • 举报
回复
楼主有这份心就够了,哈哈...
leonatcs 2006-12-18
  • 打赏
  • 举报
回复
我也回答附2,csdn不是牛,是有bug,你看到每人都是零分不要紧,选“管理”就可以看到每个人实际上都已经得分了。过几天可能就正常了,也有可能一直不正常,总要用“管理”看。

对于第一个问题,我觉得可以给你的exe的com添加一个结束的方法,用来close Form(或者做释放资源类的工作),“VB的程序释放自动化接口”前先调用一下这个方法。

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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