我从你的安道尔相机的文档中得到的印象
(https://neurophysicals.ucsd.edu/Manuals/Andor%20Technology/Andor_Software_Development_Kit.pdf https://neurophysics.ucsd.edu/Manuals/Andor%20Technology/Andor_Software_Development_Kit.pdf)是 DLL 不会directly可从 VBScript 访问。
文档是这样说的:
构建您自己的项目时,您必须包含文件 ATMCD32D.BAS。
该文件包含用于接口的Andor SDK函数原型
带有动态链接库ATMCD32D.DLL
他们在这里指的不是 VBScript,而是可能是更“标准”版本的 BASIC,例如 VB.NET 或现在相当古老的 VB6(“经典”VB)。这些语言具有直接调用 DLL 中的函数(例如它们的语言)的功能。
另一方面,VBSCript 显然只能访问支持 COM 规范的外部 DLL。考虑 COM 的一种方式是,它是一种从 DLL 访问对象(或类)的标准方法,而不仅仅是像从 C 等语言中获得的普通函数。然而他们的DLL似乎并不直接支持COM。 (但要仔细检查这一点,请参阅https://stackoverflow.com/a/3011424/3195477 https://stackoverflow.com/a/3011424/3195477 or https://stackoverflow.com/a/49920874/3195477 https://stackoverflow.com/a/49920874/3195477).
因此,您需要做的是编写自己的代码,该代码将充当 Andor DLL 中函数的包装器。该包装器 DLL 需要提供 COM 类,这些类又调用实际的 Andor DLL 函数。该包装器可以用任何能够生成 COM 可见 DLL 的语言编写。建议您使用 VB.NET 来实现此目的,因为这可能是合并ATMCD32D.BAS
文件。该文件的语法可能与 VB.NET 完全兼容(但是我自己无法验证)。
Visual Studio 不仅能够为您生成这样的 DLL,而且还能够使用 .NET 工具或多或少地自动生成您需要的 COM 层。在 VB.NET 项目中,您需要(至少)创建一个将从 VBScript 调用的类。该类应该具有与您需要使用的 Andor DLL 中的任何函数相对应的函数。您不必将它们全部包括在内 - 事实上,作为第一步,我只会做您可以认为是概念证明的最基本的事情,以确认所有“接线”都是正确的。类函数实际上可以只匹配 DLL 函数的名称和参数,或者您可以根据需要添加一些附加逻辑。
总而言之,我将遵循以下步骤:
- 运行 Visual Studio
- 创建一个新的VB.NET类库项目
- 在项目属性中,确保将其设置为注册为 COM 可见(我忘记了此选项的确切措辞)
- 添加一个类,比方说
WrapperClass
- 也许您可以将 .BAS 文件的内容复制到此类中。它应该包含一堆DECLARE FUNCTION https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/declare-statement#example声明,我期望。
- 添加公开
SUB
s or FUNCTION
到你的班级,只需调用DECLARE
ed 函数。
- 确保班级有
<COMVisible(true)>
属性应用于它,我也会使用<ClassInterface(ClassInterfaceType.AutoDual)>
为了这。
- 在 Visual Studio 中编译类库项目。如果一切设置正确,它还将注册它为您创建的 DLL。
- 您可能需要将 Andor DLL 复制到与包装器 DLL 相同的位置(
project\bin\debug\
通常是文件夹)
- 在 VBScript 中,您可以执行以下操作:
Set obj = CreateObject("WrapperClass")
Call obj.WrapperFunction1 ...
(我倾向于使用 C# 而不是 VB.NET,但我认为上面的策略是正确的,这些细节大部分是相同的。)
请做好准备,可能需要一些时间才能解决实施中的任何问题。使用 COM 要做的事情并不太复杂,但是有很多小陷阱。此外,这还假定了您所使用的 VBScript 环境的专有性质。
如果您没有在运行 VBScript 程序的同一台 PC 上运行 Visual Studio,那么您将需要执行一些额外的步骤来手动复制并在该 PC 上注册包装器 DLL(以便CreateObject
将工作)。也可以想象,在这种情况下可能需要 .NET 更新。如果您可以找出该 PC 上已有的 .NET 版本,我只需设置包装器 DLL 以针对所述版本进行编译;对于您需要编写的代码来说,这实际上可能并不重要。