首先,我是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中)我能够/应该阅读什么来避免像这样的愚蠢问题?
答案 0 :(得分:2)
没有必要自己实现IUnkown.QueryInterface。从TestComImpl中删除该方法,让TComObject处理它。还要确保为ITestCom界面提供GUID。
答案 1 :(得分:0)
如果在QueryInterface返回后发生崩溃,我会做的是在调用QueryInterface时在Java应用程序中放置一个断点,看看它接下来要做什么。那会让你知道在哪里看。
您的评论似乎证实了这一点。它正在调用QueryInterface,返回一个结果,说明这个接口是好的,并尝试将它用于立即中断的东西。但是如果你注释掉代码告诉它界面是好的,它最终不会尝试使用界面,并且没有任何破坏。
如果您不熟悉Delphi,则访问冲突通常意味着空指针取消引用。这里,它表示您的指令指针位于内存位置0x000002。这可能意味着你以某种方式尝试在尚未构建的对象上调用虚方法(或接口方法)。
希望有所帮助!
答案 2 :(得分:0)
我从头开始用COM制作了一个dll,
谢谢大家的帮助!