一个接口自动释放就出错的问题,请 masterz(MS MVP) 先生帮忙啦!

时间:2022-03-20 16:23:33
我写了个基于MFC的Activex自动化组件DLL程序。
然后在客户端初始化了接口,
m_iApplication.CreateDispatch("VBAIDE.Application");
程序在运行时没什么问题,可是就在程序关闭时,报出错误消息,我查了一下,就是这个接口在自动释放时出错。什么原因??

更为奇怪的是,同样的代码,在其他程序调用这个组件在自动释放时就没有这个错误。

12 个解决方案

#1


帮你UP了

#2


帮你UP,希望MVP现身,呵呵

#3


给出代码吧

#4


现在问题基本已经查明,我在DLL中实现了多文档的框架/窗口。在正常情况下是不出错的,可是我在DLL的框架程序中又再次调用了其他的DLL,再退出时就出错了,而且还出现了大量内存泄漏。不知道该怎样解决??

#5


其他dll 释放了吗?

看看引用计数

仔细检查,没别的方法

#6


在程序退出之前调用m_iApplication.ReleaseDispatch呢?
有这种可能:
CoUnitialize()之后,m_iApplication再release就会出错。所以你保证m_iApplication在COM uninitialize之前释放

#7


谢谢楼上两位,问题找到了,我在另一个DLL的初始化生命地方发现了
// Insert this DLL into the resource chain
// NOTE: If this Extension DLL is being implicitly linked to by
//  an MFC Regular DLL (such as an ActiveX Control)
//  instead of an MFC application, then you will want to
//  remove this line from DllMain and put it in a separate
//  function exported from this Extension DLL.  The Regular DLL
//  that uses this Extension DLL should then explicitly call that
//  function to initialize this Extension DLL.  Otherwise,
//  the CDynLinkLibrary object will not be attached to the
//  Regular DLL's resource chain, and serious problems will
//  result.
这样的说明,也许正是因为这个原因造成的。可是有个问题我还是弄不明白,那就是DLL我是隐式链接的,那么又怎样去显式调用CDynLinkLibrary 来初始化它呢??

#8


//...then you will want to
//  remove this line from DllMain and put it in a separate
//  function exported from this Extension DLL.
那是一行什么?你按照他的说明,把它取出来,另外export一个函数,然后在你的初始化部分调用这个函数

#9


我知道呀,可是具体怎么做呢?我导出了一个函数,可是在初始化部分总是不承认这个函数。你能否给出个具体例子??谢谢啦~~!!

#10


"可是在初始化部分总是不承认这个函数"
那你就用LoadLibrary, GetProcAddress的方式
我不知道你的具体情况,也没有遇到过这种问题,只能大致猜测一下,提供一点建议了。没有例子

#11


我也遇到这种情况,郁闷

#12


up

#1


帮你UP了

#2


帮你UP,希望MVP现身,呵呵

#3


给出代码吧

#4


现在问题基本已经查明,我在DLL中实现了多文档的框架/窗口。在正常情况下是不出错的,可是我在DLL的框架程序中又再次调用了其他的DLL,再退出时就出错了,而且还出现了大量内存泄漏。不知道该怎样解决??

#5


其他dll 释放了吗?

看看引用计数

仔细检查,没别的方法

#6


在程序退出之前调用m_iApplication.ReleaseDispatch呢?
有这种可能:
CoUnitialize()之后,m_iApplication再release就会出错。所以你保证m_iApplication在COM uninitialize之前释放

#7


谢谢楼上两位,问题找到了,我在另一个DLL的初始化生命地方发现了
// Insert this DLL into the resource chain
// NOTE: If this Extension DLL is being implicitly linked to by
//  an MFC Regular DLL (such as an ActiveX Control)
//  instead of an MFC application, then you will want to
//  remove this line from DllMain and put it in a separate
//  function exported from this Extension DLL.  The Regular DLL
//  that uses this Extension DLL should then explicitly call that
//  function to initialize this Extension DLL.  Otherwise,
//  the CDynLinkLibrary object will not be attached to the
//  Regular DLL's resource chain, and serious problems will
//  result.
这样的说明,也许正是因为这个原因造成的。可是有个问题我还是弄不明白,那就是DLL我是隐式链接的,那么又怎样去显式调用CDynLinkLibrary 来初始化它呢??

#8


//...then you will want to
//  remove this line from DllMain and put it in a separate
//  function exported from this Extension DLL.
那是一行什么?你按照他的说明,把它取出来,另外export一个函数,然后在你的初始化部分调用这个函数

#9


我知道呀,可是具体怎么做呢?我导出了一个函数,可是在初始化部分总是不承认这个函数。你能否给出个具体例子??谢谢啦~~!!

#10


"可是在初始化部分总是不承认这个函数"
那你就用LoadLibrary, GetProcAddress的方式
我不知道你的具体情况,也没有遇到过这种问题,只能大致猜测一下,提供一点建议了。没有例子

#11


我也遇到这种情况,郁闷

#12


up