请问出现QueryInterface错误,该怎么解决

Muf 2002-07-18 08:57:18
加精
在程序中使用了COM组件,运行都很正常。但空闲几十分钟后,再次操作程序,往往会出现例外:
接口 Microsoft.Vsa.IVsaEngine 的 QueryInterface 失败。

在我的程序中不只这个接口,IWebBrowser接口也会,还有我自已用C++编写的ActiveX控件在Unadvise事件时也发现类似的错误。

请问为什么会突然出现这类错误呢?

附:
上面提到的IWebBrowser接口,实际上是在Form中放置WebBrowser控件(ActiveX),然后在需要时,通过DOM修改控件中的页面内容(为此特意引用mshtml.dll)。
...全文
794 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqchen79 2002-07-29
  • 打赏
  • 举报
回复
参见
http://www.csdn.net/expert/topic/903/903882.xml?temp=.1556665

sumtec 2002-07-28
  • 打赏
  • 举报
回复
//ft
难道是我的机子的问题不成?但是别的地方都好好的啊!包括263什么的。唯独就这里的字体变了。
Latitude 2002-07-28
  • 打赏
  • 举报
回复
还好呀,我没发现字体的问题。
sumtec 2002-07-28
  • 打赏
  • 举报
回复
我再说两句:
1、我后来是国有一次通宵运行,但是什么也没有按,结果第二天早上再来看,发现已经被终止了,抛出了一个什么SHxxxxxxException的东西。我本来想做一个截图的,结果恰好有事,走开了一会儿,大概是一个多小时吧。(程序还没有完全终止,但已经弹出了异常对话框了。) 回来的时候发现整个Windows2000 Advance Server已经崩溃掉了——蓝屏,好像说是StackFrameNotInPageError之类的东西,已经Dump了整个内存……
2、我27号上来CSDN看,字体还是好好的,但是28号上来看到贴子内的字体……好恶心啊!七拐十八弯的,又模糊不清,不是我机子的问题吧?大家帮我证实一下贴子里的字体是不是改了,而且变得恶心了?
CSDNM 2002-07-27
  • 打赏
  • 举报
回复
收藏!
Muf 2002-07-24
  • 打赏
  • 举报
回复
辛苦你了。暂不结账,让更多人给你鼓掌好了。
有不同意见的吗?
sumtec 2002-07-24
  • 打赏
  • 举报
回复
DOC ID: FX-BG-MS.NET-VB-E-0193

Sumtec宇宙技术支持中心 VB技术支持部

试 验 报 告

题目:关于发生在多线程调用ActiveX控件时出现的
System.InvalidCastException 异常的情况

日期:2002.7.24 时间:大概下午两点半吧……然后一致到五点左右
地点:南京 人物:Sumtec
天气:晴朗 气温:38·C (幸亏有空调!室内温度28·C)
湿度:58% 气压:1.039 MPa

试验设备:
设备名称 数量 备注
计算机 1台 Althon ThunderBird 1G + "PK045+"
256M SDR KingMax PC133
DeskStar IV 7200rpm 40G
nVidia Geforce2 Pro
Samsung SyncMaster 753DF
TP-Link 10/100M Lan
Windows2000 Advance Server + SP2 +
Security Package
Visual Studio .NET (framework v1.0.3705)
椅子 1张 摇摇晃晃的。
桌子 1张 散过架的。
人 1个 Sumtec。(状态良好。)


-----------------------------------------------------------------Page 1 of 1
步骤:

1.用AxImp生成SHDocVw.DLL 的.NET运行库 AxSHDocVw.DLL

2.按照http://www.csdn.net/Expert/TopicView1.asp?id=895686中的方法重现事故现场。
结果:与文中提到的问题一致,其堆栈情况如下:
SHDocVw.IWebBrowser2.Navigate(...)
System.AxHost.AxSHDocVw.AxWebBrowser.Navigate(...)
Application1.Form1.NavigateURL(...)
Application1.Form1.ThreadNavigate()
推断:由于最终抛出点在SHDocVw.IWebBrowser2.Navigate(...),因此有可能是SHDocVw.IWebBrowser2的问题,或者说原始控件写得不好。但是也不能排除System.AxHost.AxSHDocVw的问题,因为如果是AxSHDocVw出现问题的话有可能会引起SHDocVw的问题。同时由于是InvalidCastException,有理由怀疑是类型转换的问题,这个可能是内部转换的问题。为了查找问题所在,我们必须首先分析System.AxHost.AxSHDocVw,这个DLL是由AxImp制造出来的,所以首先必须研究AxImp。

3.通过对AxImp的研究发现,里面有一个参数/source可以生成代码,因此加上该参数重新生成,可得到AxSHDocVw.DLL的源代码(C#)。
推断:根据生成的代码AxSHDocVw.cs,可以看到下列几句:

public virtual void Navigate(string uRL, [System.Runtime.InteropServices.Optional()] ref object flags, [System.Runtime.InteropServices.Optional()] ref object targetFrameName, [System.Runtime.InteropServices.Optional()] ref object postData, [System.Runtime.InteropServices.Optional()] ref object headers) {
if ((this.ocx == null)) {
throw new System.Windows.Forms.AxHost.InvalidActiveXStateException("Navigate", System.Windows.Forms.AxHost.ActiveXInvokeKind.MethodInvoke);
}
this.ocx.Navigate(uRL, ref flags, ref targetFrameName, ref postData, ref headers);
}

其中上面有一个抛出的语句,但是类型为InvalidActiveXStateException,不对号。但是考虑到其前提条件是this.ocx == null,有可能因为多线程的原因出现问题,所以还是对这句话添加断点监视。
其后的this.ocx.Navigate显然就是堆栈跟踪里面的SHDocVw.IWebBrowser.Navigate(...),如果转换代码没问题,那么问题就应该是在SHDocVw.IWebBrowser.Navigate(...)里面了。

4.在工程里面添加一个新的C#空项目(Project1.csproj),添加现有代码AxSHDocVw.cs,添加引用SHDocVw.DLL、System.DLL、System.Windows.Forms.DLL。然后在原来的工程里面移除对AxSHDocVw.DLL的引用,同时增加对项目Project1.csproj的引用。运行并跟踪。
结果:惊人!运行后开始无症状,后来……下面是出错时的输出:

Navigate Thread:554:
未处理的“System.ExecutionEngineException”类型的异常出现在 ptry.dll 中

出现该症状之前,很幸运,我对整个过程加了断点,也就是AxSHDocVw.Navigate(...)是单步调试的。this.ocx != null,没有抛出 InvalidActiveXStateException。程序继续运行到 this.ocx.Navigate(...)之后抛出异常,但是这个异常已经不是System.InvalidCastException,而是System.ExecutionEngineException!在该Exception抛出之后,程序死锁,无法停止或暂停,最后是通过TaskMan终止测试程序(不是DevEnv)的进程恢复正常的。
查了一下System.ExecutionEngineException的描述如下:

备注
执行引擎错误是致命错误,决不应该发生。此类错误主要是在执行引擎被破坏或丢失数据时发生的。系统会随时引发此异常。在可能的情况下,系统将引发比 ExecutionEngineException 异常能提供更多信息的异常。

应用程序不应引发 ExecutionEngineException。

ExecutionEngineException 使用值为 0x80131506 的 HRESULT COR_E_EXECUTIONENGINE。

推断:很明显,如果出现该Exception,很有可能是因为MS的Bug,或者MS的粗心大意没有考虑周全引起的。至少可以认为我们很难知道到底发生了什么问题,因为如果容易得到问题的描述,虚拟机就不应该抛出这个错误。猜测是Bug的可能性非常大,而用户可避免的可能性几乎为零,因为这种无法判断产生条件的异常情况(只知道要等很久才会发生),在没有任何源代码的情况下,在AxSHDocVw源代码方式下出现异常时无法暂停的情况下,我们在微软解释问题所在之前无法判断出现问题的地方,更不要谈解决之道,看来只能通过在同一个线程里面调用来避免了!
考虑到如果不用源代码,而用DLL的情况下给出的Exception是InvalidCastException,我们仍然可以假设问题确实就是InvalidCastException。但是这对我们来说毫无意义,因为我们不知道哪个变量的Cast出现Exception,也不知道从哪个类型Cast到哪个类型,更不知道为什么一开始没问题后来就有问题了。请各位兄弟暂时放下这个问题,等MS的说法吧。

5.由于出现了System.ExecutionEngineException,并且无法暂停进行分析调试,所以整个试验到此结束。谢谢观看!
(给点掌声啊!)

试验人签名:
Sumtec
July 24th, '02

------------------------------ End Of Page ------------------------------
sumtec 2002-07-23
  • 打赏
  • 举报
回复
正在试验中……请稍后再试
Muf 2002-07-23
  • 打赏
  • 举报
回复
问题 http://www.csdn.net/Expert/TopicView1.asp?id=895686
你可以100%重现问题所在,不象我问的这么抽象。
我想这样可以让有心人比较容易看清问题吧。
虽然如此,我对这问题短期内不抱太太希望。
只是不知道MS是否已经知道了这个BUG?
Muf 2002-07-23
  • 打赏
  • 举报
回复
我什么方法没用过?最后只好搞成单线程才行。

然后问题细化为:
http://www.csdn.net/Expert/TopicView1.asp?id=895686
哪位能解决这个问题的,绝对可以称得上是真正的.net专家了。
sumtec 2002-07-23
  • 打赏
  • 举报
回复
你试一下在Sub Main()里面,或者类似的启动代码里面添加这句话:
Thread.CurrentThread.ApartmentState = ApartmentState.MTA

这是你提供的微软网页上说的,不知道有效不?
我没有试过。
daehappy 2002-07-21
  • 打赏
  • 举报
回复
up!gz!
sumtec 2002-07-20
  • 打赏
  • 举报
回复
你的问题我不知道如何解决,但是从你找到的那篇文章来看,似乎是因为你所使用的控件不支持自由线程(Free-threaded)造成的。至于是什么意思我不知道。在他那篇文章里面的解决办法是,如果程序本身是STA的,那就只能在建立该连接的线程连接,如果程序是MTA的,那就可以在不同的线程里面建立、调用。

对于不能解决您的问题,表示非常抱歉。
Muf 2002-07-20
  • 打赏
  • 举报
回复
我在MS站点上找到这个:
http://support.microsoft.com/default.aspx?scid=kb;en-us;Q313510

BUG: Error Message When You Call an OleDbDataReader Object: System.InvalidCastException: QueryInterface for Interface IRowset Failed (Q313510)

但不知其它COM是否也存在类似的问题?
或者帮我出个主意,或指引个方向也好。

16,722

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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