描述:
用ATL写的控件,本来有一个接口:
[
object,
uuid(26AECA99-7596-49AD-866C-54D19FF54D2A),
dual,
helpstring("IMit Interface"),
pointer_default(unique)
]
interface IMit : IDispatch
{
[id(1), helpstring("method FirstInterface")] HRESULT FirstInterface();
};
在vc/vb/delphi下都运行正常,然后需要添加功能,在com接口不能更改的原则下,添加新的接口:
[
object,
uuid(A9EBFB14-3DA6-4984-A0C6-C7AF7AE276A0),
dual,
helpstring("IMit2 interface"),
pointer_default(unique)
]
interface IMit2 : IMit
{
[id(2), helpstring("method SecondInterface")] HRESULT SecondInterface();
};
vb/vc下使用没问题,但是delphi下调用IMit2中的SecondInterface每次都是异常,why???知道的同学快来发言。200分奉上
解决方案1:
查明,应该是delphi处理多接口时的一个bug?不好说,反正他每次调用接口2中的方法,都多偏移了一个接口1大小的偏移量,adjustor thunker方面的东西,去msdn看看吧!
解决方案2:首先,你将SecondInterface()中的代码屏蔽,用来排除是SecondInterface()中的代码造成的异常。再就是SecondInterface是否有传参数,会不会是参数导致的。最后,也是最可能解决的途径,那就是重新在Delphi中将ATL控件导入,因为你虽然在操作系统中注册了该ATL控件,但Delphi中不一定更新了,所以你调用时一定会异常,而IMit是以前就有的,所以调用IMit接口就不会出错。建议你采用类似于C++中的new 方法在Delphi中创建IMit2对象,这样就可以捕获到异常了!好运!
解决方案3:帮楼主顶!,关注!
解决方案4:重新注册一下,看注册信息是否成功
解决方案5:估计是一些注册的信息没有被更新,尤其是参考的tlb文件在注册表中的信息(tlb文件地址)可能没有被更新!
解决方案6: 先吧原来的注册取消,然后再重新注册
或者看看注册表里面有没有SecondInterface注册成功的信息
楼上的说得很到位了,我再补充一点,那就是DELPHI生成的包装代码也需要更新.