Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从VBScript读取DLL(或VB6)文件_Dll_Vbscript_Vb6 - Fatal编程技术网

从VBScript读取DLL(或VB6)文件

从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

我正在尝试使用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已经注册,因为它是与摄像头软件一起安装的,所以我只需要使用:

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函数的名称和参数,也可以根据需要添加一些附加逻辑

总之,以下是我将遵循的步骤:

  • 运行VisualStudio
  • 创建新的VB.NET类库项目
  • 在项目属性中,确保将其设置为注册为COM可见(我忘记了此选项的确切措辞)
  • 添加一个类,比如说
    WrapperClass
  • 可能您可以将.BAS文件的内容复制到此类中。我想它应该包含一堆语句
  • 将public
    SUB
    s或
    FUNCTION
    s添加到只调用
    DECLARE
    ed函数的类中
  • 确保类具有应用于它的
    属性,我也会为此使用
  • 在VisualStudio中编译类库项目。如果一切设置正确,它也将注册它为您创建的DLL
  • 您可能需要将AND或DLL复制到与包装器DLL相同的位置(
    project\bin\debug\
    文件夹通常)
  • 在VBScript中,您可以执行以下操作:
  • (我倾向于使用C#而不是VB.NET,但我认为上述策略是正确的,这些细节基本相同。)

    做好准备,可能需要一些时间来解决实现中的任何问题。你要用COM做的不是太复杂,而是
    Set obj = CreateObject("WrapperClass")   
    Call obj.WrapperFunction1 ...