【问题标题】:Use COM interface without type library in LabVIEW在LabVIEW中使用没有类型库的COM接口
【发布时间】:2013-09-22 15:44:27
【问题描述】:

我正在使用其 COM 接口控制第三方软件,但该接口没有类型库。它是不再支持的旧软件,因此不可能获得更新版本。

没有类型库,我可以在 VBScript 中正常访问所有内容:

Set spc = CreateObject( "WinAcquisit.Spectrum" )
spc.TransmitExperiment

或 Python(通过 win32):

import win32com.client as cl
spc = cl.Dispatch("WinAcquisit.Spectrum")
spc.TransmitExperiment()

但是,我通过 LabVIEW 控制软件,这似乎需要一个类型库 (TL) 来选择方法/变量(根据 TL 中的内容,所有内容都会变成下拉列表)。所以我不能在我的LabVIEW代码中使用任何东西。

如果没有匹配的 TL,如何在 LabVIEW 中使用此接口?或者,有没有一种简单的方法来创建 TL 并将其链接到现有的 COM 接口?

【问题讨论】:

  • 你确定是缺少类型库吗?...
  • @CookieOfFortune 非常确定。当我查看 oleview.exe 时,它​​告诉我该特定连接没有类型库。

标签: com labview typelib


【解决方案1】:

如果你有实际的接口定义(没有类型库),最简单的方法可能是在这个 COM 类上编写一个瘦包装器。包装器将带有类型库并可用于脚本目的。在包装器上获取调用,您会将它们转发到相关的第三方接口。本机代码包装器可能足够灵活,甚至可以接管“WinAcquisit.Spectrum”ProgID。

【讨论】:

  • 您使用您最喜欢的开发环境(C#、C++、Delphi 等 - 我不确定 Python)设计了一个新的 COM 对象,能够生成带有类型库的 COM 服务器。在那里你模仿原始服务器,添加相同的方法等。实现会将调用转发到有问题的旧服务器。
  • 我会尝试在 OLEView 中打开该 DLL/EXE,看看它是否包含可以通过编程方式注册的类型库。如果 OLEView 找不到类型库,请尝试实例化一个对象并检查其 IDispatch 并查看“TypeInfo...”按钮是否可用(如果资源中没有类型库,则此按钮将被禁用) .至少,如果可以的话,我们会得到一些 IDL 来破解并提供给 midl.exe 以重新生成类型库。任何其他方式似乎都试图在二进制级别猜测太多。
  • @Magnesium,我不知道 LabVIEW。如果您有接口和方法的文档,并且 DISPID 是固定的,则可以在 IDL 中定义匹配的dispinterfaces。另一方面,如果 DISPID 是按需生成的,我想您必须包装对该组件的访问。
  • @RomanR.,确实如此。我想知道 typelib 是否没有以某种方式注册,但是不太可能正确注册组件而不是它的 typelib ..
  • @Magnesium,documentation for the MIDL dispinterface attribute 是一个好的开始。每个id(<number>) 都是一个DISPID。您可以尝试猜测它们是否已使用较低级别的代码进行修复,例如查看来自对 IDispatch::GetIDsOfNames 的调用返回的 ID 是否以随机顺序在不同进程中返回相同的 ID方法/属性。如果是这样,把它写下来,这样你就可以定义一个dispinterface 并使用 midl.exe 来生成一个类型库。
猜你喜欢
  • 2011-08-23
  • 1970-01-01
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 2013-02-04
  • 2010-11-05
相关资源
最近更新 更多