从 VBScript 读取 DLL(或 VB6)文件

2024-03-12

我正在尝试使用 VBScript 访问 VBA 文件(或 DLL)中的函数。我有点力不从心,而且我通常不使用这两种语言,所以我会解释一下情况,以防有更好的解决方案。

我有一个仪器,它有一个类似 VBScript 的内部窗口(它具有 VBScript 中未找到的一些功能,例如“Include...End Include”语句),可用于自动化仪器操作,我正在尝试与相机结合使用。对于相机,该公司提供了 VB (atmcd32d.bas) 和 C++ (atmcd32d.cpp) 文件,其中包含与 DLL 文件 (atmcd32d.dll) 通信所需的所有函数(例如 GetTemperature、StartAcquisition 等),我使用该文件假设向相机发送命令。如果我使用 C++ 或 VBA,我假设我可以直接包含这些文件,这将使我的代码能够访问控制相机所需的命令。但主仪器软件使用的脚本语言最接近VBScript。如果我将其更改为 .txt,该脚本允许我包含该文件,但是当它到达“Attribute”、“ENUM”和“Declare Function”等不属于 VBScript 的命令时,它当然会失败。

首先,我想知道是否有更好的方法来运行 .bas 文件。

或者,我想我可以尝试从 .bas 文件中翻译我需要的函数,这样我就可以从 VBScript 与 DLL 进行通信。这将一个问题变成了两个问题。 它造成的第一个问题是翻译,我不确定这是否是一个现实的方法。由于是750行的文件,我想先问问别人。

第二个问题是如何与DLL通信。我找到了一个关于使用 VBScript 与 DLL 通信的页面:如何从 VBScript 调用 C# DLL 函数 https://stackoverflow.com/questions/769332/how-to-call-c-sharp-dll-function-from-vbscript

我尝试使用这种方法。就我而言,我假设 DLL 已经注册,因为它是与相机软件一起安装的,所以我只需要使用:

Set obj = CreateObject("C:\MyPath\atmcd32d.dll")

访问相机功能。但是,如果我仅使用该行运行脚本,则会收到消息“ActiveX 组件无法创建对象”。这是否意味着 DLL 未注册?或者我犯了其他错误?

我对这个复杂的问题表示歉意,但考虑到我已经超出了我的理解范围,我认为在我在错误的方向上挖得太深之前我应该​​寻求帮助。


我从你的安道尔相机的文档中得到的印象 (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 函数的名称和参数,或者您可以根据需要添加一些附加逻辑。

总而言之,我将遵循以下步骤:

  1. 运行 Visual Studio
  2. 创建一个新的VB.NET类库项目
  3. 在项目属性中,确保将其设置为注册为 COM 可见(我忘记了此选项的确切措辞)
  4. 添加一个类,比方说WrapperClass
  5. 也许您可以将 .BAS 文件的内容复制到此类中。它应该包含一堆DECLARE FUNCTION https://learn.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/declare-statement#example声明,我期望。
  6. 添加公开SUBs or FUNCTION到你的班级,只需调用DECLAREed 函数。
  7. 确保班级有<COMVisible(true)>属性应用于它,我也会使用<ClassInterface(ClassInterfaceType.AutoDual)>为了这。
  8. 在 Visual Studio 中编译类库项目。如果一切设置正确,它还将注册它为您创建的 DLL。
  9. 您可能需要将 Andor DLL 复制到与包装器 DLL 相同的位置(project\bin\debug\通常是文件夹)
  10. 在 VBScript 中,您可以执行以下操作:
Set obj = CreateObject("WrapperClass")   
Call obj.WrapperFunction1 ...

(我倾向于使用 C# 而不是 VB.NET,但我认为上面的策略是正确的,这些细节大部分是相同的。)

请做好准备,可能需要一些时间才能解决实施中的任何问题。使用 COM 要做的事情并不太复杂,但是有很多小陷阱。此外,这还假定了您所使用的 VBScript 环境的专有性质。

如果您没有在运行 VBScript 程序的同一台 PC 上运行 Visual Studio,那么您将需要执行一些额外的步骤来手动复制并在该 PC 上注册包装器 DLL(以便CreateObject将工作)。也可以想象,在这种情况下可能需要 .NET 更新。如果您可以找出该 PC 上已有的 .NET 版本,我只需设置包装器 DLL 以针对所述版本进行编译;对于您需要编写的代码来说,这实际上可能并不重要。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 VBScript 读取 DLL(或 VB6)文件 的相关文章

  • 在 Matlab、VB6 和 VB.NET 程序之间发送消息的最简单方法

    我们正在将一套数据采集和分析例程从 VB6 程序升级为 VB NET VB6 和 Matlab 程序的混合体 我们希望保持系统模块化 单独的 EXE 以便我们可以轻松创建专门的独立分析程序 而无需不断升级大型应用程序 当所有程序都是用 VB
  • 如何使用 DLL 来模拟静态库的“应用程序内全局变量的多个实例”行为?

    我们有一个用 C C 编写的应用程序 它被分解为单个 EXE 和多个 DLL 这些 DLL 中的每一个都使用相同的静态库 utilities lib 实用程序静态库中的任何全局变量实际上在应用程序内运行时都会有多个实例 每个模块 即 DLL
  • CDO.消息编码问题

    我们目前正在将邮件递送系统更改为仅使用UTF 8 发件人姓名似乎有问题 当电子邮件包含非 ASCII 字符 希伯来语 时 主题和正文呈现正常 但发件人姓名 如出现在我的 gmail 帐户中 变为 有一行代码 myMail BodyPart
  • 为 C# 和 C++ 应用程序编写 DLL

    我需要编写几个 DLL 它们都可以从 C 应用程序和 C 应用程序访问 最初 我认为通过用 C 编写 DLL 并从 C 和 C 应用程序链接到它们可以节省时间 精力 这种方法明智吗 还是应该使用 C 编写 DLL 我的建议是在您最舒服的地方
  • 我不断听说 DLL 地狱——这是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • C# 调用返回结构的 C++ DLL 函数

    我有一个 C dll 它定义了一个结构体和一个 dll 调用 如下所示 typedef const char FString typedef struct FString version FString build no FString b
  • 使用 javascript 获取选择标签的名称

    我在任何地方都没有找到这个问题 所以我将其发布在这里 我有一堆选择标签 部分使用 VBScript 命名 我希望能够获取从 javascript 中的 onchange 事件调用的选择标签的名称 这是代码
  • Unity3D 不安全代码需要指定“unsafe”命令行选项

    我在用Unity3D 4 3并打电话给DLL我创造的 当尝试调用它唯一的函数时 这是 void GetModelReferences int nVertices float vertices int nTriangles int trian
  • Java + JNA:找不到指定的过程

    我正在尝试使用 Visual Studio 创建一个 dll 文件并在 java 项目中使用 访问它 该库似乎已加载 但总是抛出相同的异常 线程 main 中出现异常 java lang UnsatisfiedLinkError 查找函数
  • 由于 MSVCR110.dll,MS Visual Studio 2012 Ultimate 无法启动

    当我尝试运行 MVS 2012 时 我总是收到错误 在库 DLL MSVCR110 dll 中找不到过程 crtCreateSymbolicLinkW 的入口点 我已经从我的另一台计算机复制了这个 dll 文件 一切正常 但没有帮助0 o
  • 制作 C# 项目 DLL 和 EXE

    我正在开发一个项目 需要有一个可执行文件以便用户可以运行配置界面和一个可以嵌入其他项目以使用其他一些功能的 DLL 有没有办法让 Visual Studio 同时生成可执行文件和 DLL 而不是每次都手动切换 我同意 TJMonk15 的观
  • 使用 GdiPlus 卸载 DLL 时程序挂起

    我有一个加载 DLL 的应用程序 它使用德尔福 GDI 库 http sourceforge net projects delphigdiplus 该应用程序在卸载 DLL 时挂起 调用免费图书馆 https msdn microsoft
  • 防止打开 VB 应用程序的多个实例

    我的 VB6 应用程序由 MS Access 数据库支持 允许用户打开应用程序的多个实例会产生冲突并更改连接的数据库 理想的解决方案是 如果用户尝试打开新实例 则关注现有实例 我怎样才能达到这个目的 Use App PrevInstance
  • 有关于 VBScript 正则表达式对象 (RegExp) 的好文档吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们都知道每个正则表达式实现都有其自身的特点 我需要在使用 COM 自动化的应用程序中使用 Micros
  • 如何在 Visual Basic DLL 和 C++ DLL 之间创建隔离/免注册 COM?

    我必须在 C DLL 中使用 VB COM DLL 我弄清楚了如何从 C DLL 访问 VB COM DLL 并且它可以工作 现在我遇到了一个问题 我必须使用隔离的 COM 免注册 COM 因为我无法在必须使用它的每台 PC 上注册 DLL
  • 尝试使用适用于 Windows XP 的 Heroku 时未找到 msvcrt-ruby18.dll

    我有一个学生在 Windows XP 上进行开发 他在尝试运行时遇到了一个奇怪的错误heroku keys add 错误是 This application has failed to start because msvcrt ruby18
  • SidBySide:3rd Party Dll 指的是 MSVCR80.DLL 的两个版本

    我们包含了一个 3rd Party lib DLL 最近在安装时造成了很多麻烦 使用依赖步行者 http www dependencywalker com 我们发现dll本身引用了两个不同版本的 MSVCR80 DLL Version 8
  • 如何从 HTA 中启动批处理文件

    我有一个基本的 HTA 其中我尝试通过按钮启动批处理文件 但是当我尝试启动批处理文件时 它不会运行 当我按下按钮时 将启动命令提示符窗口 但不会运行脚本 这是代码的简单示例
  • Visual Studio 2012 本机 C++ DLL x86 编译

    我最近将我的工具集从 Win 7 x86 Visual Studio 2010 升级到 Win 8 x64 Visual Studio 2012 但是 现在我的本机 C dll 编译为 x64 而不是 x86 除了将代码移至新操作系统并将其
  • C# 中 DLL 和命名空间的关系

    这里有一个高级问题 今天我花了很多时间自学基本的高级概念 例如 API 静态和动态库 DLL 以及 C 中的编组 获得所有这些知识让我想到了一个看起来非常基本的问题 并且可能表明我对这些概念的理解存在漏洞 我知道的 DLL 可能包含类 这些

随机推荐