Delphi中GetInterface / QueryInterface之后的访问冲突

时间:2010-04-23 11:19:09

标签: delphi com queryinterface

首先,我是Delphi和COM的新手,但我应该在Delphi中构建COM应用程序。我阅读了很多关于互联网的文章和说明,但是Delphi中的COM和COM仍然不清楚。

我的消息来源 - http://www.everfall.com/paste/id.php?wisdn8hyhzkt(约80行)。

我尝试创建一个COM接口和Impl类 - 如果我从Delphi调用一个接口方法(我通过TestClient.Create创建一个impl对象),它会起作用,但如果我尝试从外部世界创建一个对象(来自Java) ,通过com4j)我的应用程序崩溃了以下异常:

Project Kernel.exe raised exception class $C0000005 with 
message 'access violation at 0x00000002: read of address 0x00000002'.

如果我在QueryInterface中设置断点 - 它会中断,但是当我从函数中退出时 - 所有崩溃。

我做错了什么?我还缺少什么?关于COM(在Delphi中)我能够/应该阅读什么来避免像这样的愚蠢问题?

3 个答案:

答案 0 :(得分:2)

没有必要自己实现IUnkown.QueryInterface。从TestComImpl中删除该方法,让TComObject处理它。还要确保为ITestCom界面提供GUID。

答案 1 :(得分:0)

如果在QueryInterface返回后发生崩溃,我会做的是在调用QueryInterface时在Java应用程序中放置一个断点,看看它接下来要做什么。那会让你知道在哪里看。

您的评论似乎证实了这一点。它正在调用QueryInterface,返回一个结果,说明这个接口是好的,并尝试将它用于立即中断的东西。但是如果你注释掉代码告诉它界面是好的,它最终不会尝试使用界面,并且没有任何破坏。

如果您不熟悉Delphi,则访问冲突通常意味着空指针取消引用。这里,它表示您的指令指针位于内存位置0x000002。这可能意味着你以某种方式尝试在尚未构建的对象上调用虚方法(或接口方法)。

希望有所帮助!

答案 2 :(得分:0)

我从头开始用COM制作了一个dll,

  1. 我使用DllRegisterServer - 它让我有可能控制服务器注册(结束 我第一次尝试TComObjectFactory.RegisterClassObject)
  2. 我从TestComImpl
  3. 中删除了QueryInterface
  4. Com4j仅支持STA(公寓)线程模型(我假设RegisterClassObject使用 MTA)
  5. 因此,如果注册为公寓(STA)或两者的类 - com4j可以创建实例。
  6. 谢谢大家的帮助!