【发布时间】:2021-07-17 06:09:57
【问题描述】:
我正在尝试使用 VBScript 访问 VBA 文件(或 DLL)中的函数。我有点不知所措,而且我通常不会使用这两种语言,所以我会解释一下情况,以防有更好的解决方案。
我有一个仪器,它有一个内部类似 VBScript 的窗口(它有一些 VBScript 中没有的功能,例如“Include...End Include”语句),可用于自动化仪器操作,我'我试图将它与相机结合使用。对于相机,该公司提供了 VB (atmcd32d.bas) 和 C++ (atmcd32d.cpp) 文件,其中包含与 DLL 文件 (atmcd32d.dll) 通信所需的所有函数(例如,GetTemperature、StartAcquisition 等),我假设向相机发送命令。如果我使用 C++ 或 VBA,我假设我可以直接包含这些文件,这将使我的代码能够访问控制相机所需的命令。但是,主要仪器软件使用的脚本语言最接近VBScript。如果我将文件更改为 .txt,该脚本允许我包含该文件,但是当它到达不属于 VBScript 的“属性”、“枚举”和“声明函数”之类的命令时,它当然会失败。
首先,我想知道是否有更好的方法来运行 .bas 文件。
另外,我想我可以尝试从 .bas 文件中翻译我需要的函数,这样我就可以从 VBScript 与 DLL 进行通信。这将一个问题变成了两个问题。 它产生的第一个问题是翻译,我不确定这是否是一种现实的方法。因为是750行的文件,所以想先问问别人。
第二个问题是如何与 DLL 通信。我找到了一个关于使用 VBScript 与 DLL 通信的页面:How to call C# DLL function from VBScript
我尝试使用这种方法。对于我的情况,我假设 DLL 已经注册,因为它是与相机软件一起安装的,所以我只需要使用:
Set obj = CreateObject("C:\MyPath\atmcd32d.dll")
访问相机功能。但是,如果我只使用该行运行脚本,则会收到消息“ActiveX 组件无法创建对象”。这是否意味着 DLL 未注册?还是我犯了其他错误?
对于这个令人费解的问题,我深表歉意,但考虑到我已经摸不着头脑,我想我应该寻求帮助,然后再深入挖掘错误的方向。
【问题讨论】:
-
CreateObject 用于创建在您注册的 dll 中定义的类的实例。因为它已注册,所以您不需要提供 dll 的路径。类的完全限定名就足够了。 (这也是链接问题的答案所说的)
-
this answer 中有很多有用的信息,其中包括 COM DLL 注册以及如何检查它是否在正确的 Windows 子系统中注册。还有一个清单可供通读,这将帮助您诊断问题。
-
这能回答你的问题吗? Using DLLs in VBScript
-
如果 atmcd32d.bas 包含 "Declare Function..." 行,例如 Declare Function Initialize Lib "atmcd32d.dll" (ByVal dirName As String) 只要 atmcd32d.dll 不是 ActiveX/COM dll所以 CreateObject 函数不能用于与 ATMCD32D.DLL 的接口。从neurophysics.ucsd.edu/Manuals/Andor%20Technology/…查看 Andor SDK 用户指南
-
ATMCD32D.DLL 的 ActiveX/COM 包装器(仅用于必要的功能)可以解决 CreateObject 函数的使用问题。