Delphi中GetInterface/QueryInterface后的访问冲突

Delphi中GetInterface/QueryInterface后的访问冲突,delphi,com,queryinterface,Delphi,Com,Queryinterface,首先,我对Delphi和COM非常陌生,但我应该在Delphi中构建COM应用程序。我在互联网上读了很多文章和注释,但我仍然不清楚Delphi中的COM和COM 我的资料来源(大约80行) 我尝试创建一个COM接口和Impl类-如果我从Delphi调用接口方法(我通过TestClient.create创建一个Impl对象),它会工作,但是如果我尝试从外部世界创建一个对象(从Java,通过com4j),我的应用程序会崩溃,出现以下异常: Project Kernel.exe raised exce

首先,我对Delphi和COM非常陌生,但我应该在Delphi中构建COM应用程序。我在互联网上读了很多文章和注释,但我仍然不清楚Delphi中的COM和COM

我的资料来源(大约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中)的内容,以避免像这样愚蠢的问题?

如果崩溃发生在QueryInterface返回后,我要做的是在Java应用程序调用QueryInterface时在其中放置一个断点,并查看它下一步尝试做什么。这会让你知道该去哪里找

你的评论似乎证实了这一点。它调用QueryInterface,返回一个表示这个接口很好的结果,并尝试将它用于一些立即中断的事情。但是如果你注释掉告诉它接口是好的代码,那么它就不会尝试使用接口,并且不会有任何中断

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


希望有帮助

没有必要实现IUnkown.QueryInterface your self。从TestComImpl中删除该方法,并让TComObject处理它。还要确保为ITestCom接口提供一个GUID。

我用COM从头制作了一个dll

  • 我使用DllRegisterServer-它使我能够控制服务器注册(超过 TComObjectFactory.RegisterClassObject(第一次尝试时)
  • 我从TestComImpl中删除QueryInterface
  • Com4j只支持STA(单元)线程模型(我假设RegisterClassObject使用 (MTA)
  • 所以,如果类注册为公寓(STA)或两者都注册,那么com4j可以创建实例

  • 谢谢大家的帮助

    如果我取消了QueryInterface中的代码注释-没有访问冲突,但是com4j说该接口不受支持。你能给我们一个Java端的代码列表吗?对不起,现在不行。我家里没有这个项目。大多数情况下,它是由com2j自动生成的,并且只包含CoCreateInstance(CLSID)。您好,还是生成的java代码:如果我删除IUnknown.QueryInterface-com4j表示该接口(ITestCom)不受支持。如果是这样,您的对象是从何而来的?您确定该接口有这样的IID(GUID):ITestCom=interface(IUnknown)['{0D57624C-CDDE-458B-A36C-436AE465B477}']过程您的方法;结束;是的,我确定。接口由midl和tlibimpl从.idl文件生成。我将尝试从头开始使用COM接口创建dll…感谢您的回复,我将尝试跟踪“java”端,但地址0x02看起来像GetInterface破坏堆栈,但我认为这是不可能的。