在LabVIEW中使用不带类型库的COM接口

在LabVIEW中使用不带类型库的COM接口,com,labview,typelib,Com,Labview,Typelib,我正在使用COM接口控制第三方软件,但该接口没有类型库。这是一款不再受支持的旧软件,因此不可能获得更新版本 没有类型库,我可以在VBScript中访问所有内容: Set spc = CreateObject( "WinAcquisit.Spectrum" ) spc.TransmitExperiment 或通过win32使用Python: import win32com.client as cl spc = cl.Dispatch("WinAcquisit.Spectrum") spc.Tra

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

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

Set spc = CreateObject( "WinAcquisit.Spectrum" )
spc.TransmitExperiment
或通过win32使用Python:

import win32com.client as cl
spc = cl.Dispatch("WinAcquisit.Spectrum")
spc.TransmitExperiment()
然而,我通过LabVIEW控制软件,它似乎需要一个类型库TL来选择方法/变量。所有内容都会根据TL中的内容转换为下拉列表。因此,我不能在LabVIEW代码中使用任何内容


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

如果您有没有类型库的实际接口定义,最简单的方法可能是在这个COM类上编写一个瘦包装。包装器将与类型库一起使用,并可用于脚本编写。在wrapper上获得调用后,您将把它们转发到有问题的第三方接口。本机代码包装可以灵活地完成,甚至可以接管WinAcquisit.Spectrum ProgID。

如果您有没有类型库的实际接口定义,最简单的方法可能是在这个COM类上编写一个精简包装。包装器将与类型库一起使用,并可用于脚本编写。在wrapper上获得调用后,您将把它们转发到有问题的第三方接口。本机代码包装器可能做得足够灵活,甚至可以接管WinAcquisit.Spectrum ProgID。

您确定丢失的是类型库吗?..@cookieoffforce非常确定。当我查看oleview.exe时,它告诉我没有用于该特定连接的类型库。你确定丢失的是类型库吗?…@CookieOffort非常确定。当我在OLVIEW.EXE中看到它并没有特定的连接类型库时,你可以用你最喜欢的开发环境C、C++、Delphi等设计一个新的COM对象。在那里,您模拟原始服务器,添加相同的方法等。实现将把调用转发到有问题的旧服务器。我将尝试在OLEView中打开该DLL/EXE,以查看它是否包含可以通过编程方式注册的类型库。如果OLEView找不到typelib,请尝试实例化一个对象并检查其IDispatch,然后查看TypeInfo。。。按钮可用。如果资源中没有typelib,此按钮将被禁用。至少,如果可以的话,我们可以使用一些IDL进行破解,并将其馈送到midl.exe以重新生成typelib。任何其他的方法都像是试图在二进制级别猜太多。@magnetic,我不知道LabVIEW。如果您有接口和方法的文档,并且dispid是固定的,那么可以在IDL中定义匹配的dispi。另一方面,如果DISPID是按需生成的,我想您必须包装对该组件的访问。@RomanR.,确实如此。我想知道typelib是否没有以某种方式注册,不管组件是否正确注册,而不是它的typelib,这是一个好的开始。每个id都是一个DISPID。您可以尝试猜测它们是否使用较低级别的代码修复,例如,查看在不同进程中以随机顺序调用IDispatch::GetIDsOfNames以获取lsit的方法和属性时返回的ID是否为相同的方法/属性返回相同的ID。如果是这样,请写下来,这样你就可以定义一个Debug接口,并使用MID.EXE生成一个Type。你用你最喜欢的开发环境C、C++、Delphi等设计一个新的COM对象。在那里,您模拟原始服务器,添加相同的方法等。实现将把调用转发到有问题的旧服务器。我将尝试在OLEView中打开该DLL/EXE,以查看它是否包含可以通过编程方式注册的类型库。如果OLEView找不到typelib,请尝试实例化一个对象并检查其IDispatch,然后查看TypeInfo。。。按钮可用。如果资源中没有typelib,此按钮将被禁用。至少,如果可以的话,我们可以使用一些IDL进行破解,并将其馈送到midl.exe以重新生成typelib。任何其他的方法都像是试图在二进制级别猜太多。@magnetic,我不知道LabVIEW。如果您有接口和方法的文档,并且dispid是固定的,那么可以在IDL中定义匹配的dispi。另一方面,如果DISPID是按需生成的,我想您必须包装对该组件的访问。@RomanR.,确实如此。我想知道typelib是否没有以某种方式注册,不管组件是否正确注册,而不是它的typelib,这是一个好的开始。每个id都是一个DISPID。你可以试着猜测它们是否用较低级别的代码修复,苏 查看调用IDispatch::GetIDsOfNames以随机顺序在不同进程中为方法和属性的lsit返回的ID是否为相同的方法/属性返回相同的ID。如果是的话,写下来,这样你就可以定义一个dispinterface并使用midl.exe生成一个typelib。