首先,我在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,

  1. 我使用dllRegisterserver-它使我有可能控制服务器注册(在我的第一次尝试中通过tcomobjectfactory.registerclassobject上)
  2. 我从我的testcomimpl中删除查询方面
  3. COM4J仅支持STA(公寓)线程模型(我假设registerClassObject使用MTA)
  4. 因此,如果登记为公寓(STA)或两者 - com4j可以创建实例。

感谢大家的帮助!

其他提示

无需实现iunkown.queryinterface您的自我。从TestComimpl中删除该方法,然后让Tcomobject处理它。另外,请确保将iTESTCOM接口一个GUID。

如果崩溃发生后发生了QueryInterface返回后,我要做的是在调用QueryInterface时在Java应用中放置一个断点,然后查看下一步尝试做什么。这会让您了解在哪里。

您的评论似乎证明了这一点。它正在调用QueryInterface,取回结果,说该接口很好,并试图将其用于立即破裂的东西。但是,如果您评论说明界面很好的代码,则最终不会尝试使用该界面,也没有任何突破。

如果您不熟悉Delphi,则违反访问通常意味着无效的指针退出。在这里,它说您的说明指针位于内存位置0x000002。这可能意味着您以某种方式试图在尚未构造的对象上调用虚拟方法(或接口方法)。

希望有帮助!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top