【问题标题】:Access violation after GetInterface/QueryInterface in DelphiDelphi中GetInterface/QueryInterface后的访问冲突
【发布时间】:2010-04-23 11:19:09
【问题描述】:

首先,我是 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 中)的哪些内容以避免此类愚蠢的问题?

【问题讨论】:

  • 如果我在 QueryInterface 中取消注释代码 - 没有访问冲突,但 com4j 说不支持该接口。
  • 你能给我们一份Java端的代码清单吗?
  • 抱歉,现在不行。我家里没有项目。它主要由 com2j 自动生成,并且仅包含 CoCreateInstance (CLSID)。
  • 嗨,再次生成 java 代码:everfall.com/paste/id.php?qyvbz6upy56b

标签: delphi com queryinterface


【解决方案1】:

无需自己实现 IUnkown.QueryInterface。从 TestComImpl 中删除该方法并让 TComObject 处理它。还要确保给 ITestCom 接口一个 GUID。

【讨论】:

  • 如果我删除 IUnknown.QueryInterface - com4j 表示不支持该接口 (ITestCom)。
  • 如果是这样的话,你的对象是从哪里来的?
  • 你确定接口有这样的 IID(GUID): ITestCom = interface(IUnknown) ['{0D57624C-CDDE-458B-A36C-436AE465B477}'] procdure YourMethods;结束;
  • 是的,我确定。 midl 和 tlibimpl 从 .idl 文件生成的接口。我将尝试从头开始制作带有 COM 接口的 dll...
【解决方案2】:

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

您的评论似乎证实了这一点。它正在调用 QueryInterface,返回一个表明该接口良好的结果,并尝试将其用于立即中断的事情。但是,如果您注释掉告诉它接口良好的代码,它最终不会尝试使用该接口,并且没有任何问题。

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

希望有帮助!

【讨论】:

  • 感谢您的回复,我会尝试追踪“java”端,但地址 0x02 看起来像 GetInterface 损坏堆栈,但我认为这是不可能的。
【解决方案3】:

我用 COM 从头开始​​制作了一个 dll 并且

  1. 我使用 DllRegisterServer - 它让我可以控制服务器注册(超过 TComObjectFactory.RegisterClassObject 在我的第一次尝试中)
  2. 我从我的 TestComImpl 中删除了 QueryInterface
  3. Com4j 仅支持 STA(Apartment)线程模型(我假设 RegisterClassObject 使用 MTA)
  4. 因此,如果类注册为 Apartment (STA) 或 Both - com4j 可以创建实例。

感谢大家的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多