|
1
2
我认为这是对正在发生的事情的正确解释,以及一些潜在的解决办法。 我编写了一个测试用例,它重现了描述中的问题,然后使用oleview从包含接口的旧的&新的dll中转储了idl。 以下是来自InewReport的旧(左)和新IDL的差异:
重要区别:
(我假设这也是问题中提到的代码发生的情况。)
因此,在客户端项目中,BICOMPLDLL引用原始接口UUID;但是UUID仅与不同的名称匹配(UnID)。
如何解决这个问题?我无法在vb6中做任何事情,允许您在客户端代码中使用更新的接口dll,而不必破坏客户端代码的bincomp。 (坏)选择 可能只是更改客户端dll以使用项目兼容性…但在你的情况下,这可能是可以接受的,也可能不是。除非所有的使用者也被重新编译,否则它可能导致任何使用客户机dll的操作中断。(这可能会导致bincomp的崩溃)。 更好但更复杂的选择 将在idl本身中定义接口,使用midl编译器生成一个typelib(tlb文件),并直接引用它。然后,您将完全控制接口命名等。您可以使用从OLVIEW生成的IDL作为开始这一点的起点。 第二个选项假设接口类实际上只是一个接口,没有函数代码。 下面是我如何设置一个案例来重现这一点:
步骤1。原始接口定义-类调用
步骤2。创建一个实现
步骤3:添加
(以上代码,加:)
步骤4:尝试运行或编译测试客户端dll-立即获取操作错误。不需要更改任何引用或任何内容。 |
|
|
2
1
我用类似于daveincaz的代码重新创建了你的问题。我尝试了很多方法来修复它,可能重复了你已经尝试过的方法。我提出了一个可能的假设,为什么会发生这种情况。它不能解决问题,但它可能会给它带来一些额外的启示。 引用 This doc page :
另一句话:
所以,这里有一个假设。第一句话提到 违约 接口,这表明可能无法以任何方式更改自定义接口。这也是第二句话的意思。您可以更改接口类,因为您本质上改变了它的默认接口。但是,当您尝试以类方式更改实现类时,要反映接口中的更改,则实现引用指向的是接口的旧版本,该接口不再存在。当然,错误消息并没有暗示这一点,因为它似乎是基于您没有尝试实现该接口的想法。 我还没能证明这一点,但看看达维恩卡兹的答案,事实上Uuid已经改变了似乎证明了这个想法。 |
|
|
Kram Kramer · 通过vba自动调整文本大小以适应形状 1 年前 |
|
|
Eric · 我有邮政编码替换问题Excel VBA 1 年前 |
|
|
Chasester · VBA使用嵌套的DIV抓取URL 1 年前 |
|
Iron Man · 代码插入和复制到错误的工作表 1 年前 |
|
|
NoFafo · 将文本框放入数组进行格式化 1 年前 |
|
|
Smokestack · 过滤器范围C3:G3并粘贴到其他单元格 1 年前 |