从VBScript读取DLL(或VB6)文件
我正在尝试使用VBScript访问VBA文件(或DLL)中的函数。我有点不知所措,而且我通常不使用这两种语言中的任何一种,所以我将解释这种情况,以防有更好的解决方案 我有一个仪器,它有一个类似VBScript的内部窗口(它有一些VBScript中没有的功能,例如“Include…End Include”语句),可以用来自动执行仪器操作,我正试图将其与相机结合使用。对于相机,公司提供VB(ATMCD322.BAS)和C++(ATMCD322.CPP)文件,其中包含所有必要的功能(例如GET温度、START获取等),用于与DLL文件(ATMCD3D22.DLL)通信,我假设将命令发送到相机。如果我使用C++或VBA,我假设我可以直接包含那些文件,这将使我的代码访问控制相机所需的命令。但是,主仪表软件使用的脚本语言最接近VBScript。如果我将文件更改为.txt,脚本允许我包含该文件,但当遇到诸如“Attribute”、“ENUM”和“Declare Function”等命令时,它当然会失败,这些命令不是VBScript的一部分 首先,我想知道是否有更好的方法来运行.bas文件 或者,我想我可以尝试从.bas文件翻译我需要的函数,这样我就可以从VBScript与DLL通信。这就把一个问题变成了两个问题。 它造成的第一个问题是翻译,我不确定这是否是一个现实的方法。因为这是一个750行的文件,我想先问问其他人 第二个问题是如何与DLL通信。我找到一个关于使用VBScript与DLL通信的页面: 我试着用这种方法。就我的情况而言,我假设DLL已经注册,因为它是与摄像头软件一起安装的,所以我只需要使用:从VBScript读取DLL(或VB6)文件,dll,vbscript,vb6,Dll,Vbscript,Vb6,我正在尝试使用VBScript访问VBA文件(或DLL)中的函数。我有点不知所措,而且我通常不使用这两种语言中的任何一种,所以我将解释这种情况,以防有更好的解决方案 我有一个仪器,它有一个类似VBScript的内部窗口(它有一些VBScript中没有的功能,例如“Include…End Include”语句),可以用来自动执行仪器操作,我正试图将其与相机结合使用。对于相机,公司提供VB(ATMCD322.BAS)和C++(ATMCD322.CPP)文件,其中包含所有必要的功能(例如GET温度、S
Set obj = CreateObject("C:\MyPath\atmcd32d.dll")
以访问摄像头功能。但是,如果我只使用该行运行脚本,我会得到消息“ActiveX组件无法创建对象”。这是否意味着DLL未注册?还是我犯了其他错误
对于这个复杂的问题,我深表歉意,但考虑到我已经做得太多了,我想我应该在深入挖掘错误的方向之前寻求帮助。我从你和或相机的文档中得到的印象 ()是指无法从VBScript直接访问DLL 文件说: 构建自己的项目时,必须包含文件ATMCD32D.BAS。 此文件包含用于接口的和或SDK功能原型 使用动态链接库ATMCD32D.DLL 这里他们指的不是VBScript,而是更“标准”的BASIC版本,如VB.NET或现在相当古老的VB6(“经典”VB)。这些语言具有直接调用DLL中的函数的功能,例如它们的函数 另一方面,VBSCript显然只能访问支持COM规范的外部DLL。考虑COM的一种方式是,它是一种使对象(或类)可以从DLL访问的标准方式,而不仅仅是像从C这样的语言获得的普通函数。然而,他们的DLL似乎不能直接支持COM。(但要再次检查此项,请参阅或) 因此,您需要编写自己的代码,作为Andor DLL中函数的包装器。该包装器DLL需要提供COM类,这些COM类反过来调用实际的和或DLL函数。这个包装器可以用任何能够生成COM可见DLL的语言编写。建议您使用VB.NET实现这一点,因为这可能是合并
ATMCD32D.BAS
文件的最简单途径。该文件的语法可能与VB.NET完全兼容(但我自己无法验证)
VisualStudio完全能够为您生成这样的DLL,并且还能够使用.NET工具或多或少地自动生成您需要的COM层。在VB.NET项目中,您需要创建(至少)一个将从VBScript调用的类。该类应具有与您需要使用的AND或DLL中的任何函数相对应的函数。你不必把它们都包括进去——事实上,作为第一步,我只需要做你能想到的最基本的事情,作为概念证明,来确认所有的“接线”都是正确的。类函数可以直接匹配DLL函数的名称和参数,也可以根据需要添加一些附加逻辑
总之,以下是我将遵循的步骤:
WrapperClass
SUB
s或FUNCTION
s添加到只调用DECLARE
ed函数的类中
属性,我也会为此使用
project\bin\debug\
文件夹通常)Set obj = CreateObject("WrapperClass")
Call obj.WrapperFunction1 ...