Delphi中的GetInterface/QueryInterface后访问违规
-
01-10-2019 - |
题
首先,我在Delphi和Com中非常新,但是我应该在Delphi构建COM应用程序。我在互联网上读了很多文章和笔记,但是我在德尔福的com和com仍然不清楚。
我的消息来源 - http://www.everfall.com/paste/id.php?wisdn8hyhzkt (约80行)。
我尝试制作com界面和impl类 - 如果我从delphi调用接口方法(我通过testclient.create创建一个imp object),但是如果我尝试从外世界创建一个对象(从java,通过com4j, )我的应用程序崩溃了以下例外:
Project Kernel.exe raised exception class $C0000005 with
message 'access violation at 0x00000002: read of address 0x00000002'.
如果我在QueryInterface中设置了一个断点 - 它会断开,但是当我从功能中出来时 - 所有崩溃。
我在做什么错?我仍然想念什么?我可以/应该阅读有关COM(在Delphi)的内容,以避免这样的愚蠢问题?
解决方案 3
我从头开始与com做了一个dll,
- 我使用dllRegisterserver-它使我有可能控制服务器注册(在我的第一次尝试中通过tcomobjectfactory.registerclassobject上)
- 我从我的testcomimpl中删除查询方面
- COM4J仅支持STA(公寓)线程模型(我假设registerClassObject使用MTA)
- 因此,如果登记为公寓(STA)或两者 - com4j可以创建实例。
感谢大家的帮助!
其他提示
无需实现iunkown.queryinterface您的自我。从TestComimpl中删除该方法,然后让Tcomobject处理它。另外,请确保将iTESTCOM接口一个GUID。
如果崩溃发生后发生了QueryInterface返回后,我要做的是在调用QueryInterface时在Java应用中放置一个断点,然后查看下一步尝试做什么。这会让您了解在哪里。
您的评论似乎证明了这一点。它正在调用QueryInterface,取回结果,说该接口很好,并试图将其用于立即破裂的东西。但是,如果您评论说明界面很好的代码,则最终不会尝试使用该界面,也没有任何突破。
如果您不熟悉Delphi,则违反访问通常意味着无效的指针退出。在这里,它说您的说明指针位于内存位置0x000002。这可能意味着您以某种方式试图在尚未构造的对象上调用虚拟方法(或接口方法)。
希望有帮助!