如何在VB6中创建标准DLL?

如何在VB6中创建标准DLL?,dll,vb6,Dll,Vb6,TL:DR如何将VB6模块文件编译成可跨多个VB6应用程序使用的标准DLL 我的任务是支持用VB6编写的多个遗留应用程序 所有这些应用程序都使用我的雇主建造的硬件。在我开始为我的雇主工作之前,他已经将为项目开发DLL的工作外包给了一家公司,因为为他们工作的人最近辞职了,没有其他人能够弄清楚这一点,所以该公司不再有能力支持它 我的雇主最近升级了我们的硬件,所以更糟糕的是,公司提供给我们的DLL也不再有用了 向我们发布新硬件的公司没有向我们发布能够在VB6中运行的DLL文件,这一事实进一步加剧了这种

TL:DR如何将VB6模块文件编译成可跨多个VB6应用程序使用的标准DLL

我的任务是支持用VB6编写的多个遗留应用程序

所有这些应用程序都使用我的雇主建造的硬件。在我开始为我的雇主工作之前,他已经将为项目开发DLL的工作外包给了一家公司,因为为他们工作的人最近辞职了,没有其他人能够弄清楚这一点,所以该公司不再有能力支持它

我的雇主最近升级了我们的硬件,所以更糟糕的是,公司提供给我们的DLL也不再有用了

向我们发布新硬件的公司没有向我们发布能够在VB6中运行的DLL文件,这一事实进一步加剧了这种情况

现在我要创建一个DLL文件(不是设备驱动程序),它能够促进新设备(希望是旧设备)和VB6应用程序之间的通信

我对VB6的了解是。。。充其量是有限的。我对.Net非常熟悉,并且在.Net中创建DLL方面取得了很大的成功,但是当涉及到VB6时,我知道的足够多了。我正在进入一个未知的领域

我非常熟悉实现此功能所需的
HID.dll
SetupAPI.dll
p/调用和结构,我甚至幸运地偶然发现了它,它有一个VB6代码的工作位,可以方便地读/写连接到系统的HID。我对此进行了测试(有点坐立不安),它对我们的设备起到了开箱即用的作用。但这对我没有帮助,因为我无法将模块编译成DLL文件(更不用说计算VB6中的事件和一卡车其他东西了,但我已经超越了自己)

我已经尝试了许多不同的方法,虽然它们被证明是有前途的,但它们都不起作用

谷歌也给我带来了很多麻烦,但总体来说帮不了我什么忙

如果有必要,我甚至会用C/C++编写它(尽管如果有其他方法,我不希望这样)

那么,我想做的是可能的吗?有人能告诉我这类事情的具体步骤吗

编辑1:
更详细地说,当我说“它们不工作”时,我的意思是,在第一个链接的情况下,程序仍然无法找到函数(带有类似“函数入口点未找到”的错误消息),而在第二个情况下,我在尝试调用函数时始终反复收到内存写入错误(不有趣).

1.在您前往1998年获取VB6副本后,开始一个新的ActiveX DLL项目:

2.编辑野兽名称的项目属性

3.为正在创建的接口添加一个类。我巧妙地将类命名为
VB6Class
,因为项目/DLL的名称为VB6DLL

4.编写代码。我添加了一些测试方法来执行复杂的计算:


5.从文件菜单创建DLL。您可能需要以管理员身份运行,以便它可以注册DLL

6.在使用它的项目中,添加对DLL的引用

测试代码:

Private Sub Command1_Click()
     Dim vb6 As New VB6DLL.VB6Class

     Dim var0 As String
     Dim var1 As Integer
     Dim var2 As Long

     var0 = vb6.GetAString(0)
     var1 = vb6.DoubleMyInt(2)
     var2 = vb6.DoubleMyLong(1234)

      Debug.Print "GetAString == " & var0
      Debug.Print "DoubleMyInt == " & var1
      Debug.Print "DoubleMyLng == " & var2
End Sub
结果:

GetAString==Alpha
DoubleMyInt==4
DoubleMyLng==2468


不确定如何处理“卡车装载的其他东西”。

1。在您1998年的旅行中获取VB6副本后,开始一个新的ActiveX DLL项目:

2.编辑野兽名称的项目属性

3.为正在创建的接口添加一个类。我巧妙地将类命名为
VB6Class
,因为项目/DLL的名称为VB6DLL

4.编写代码。我添加了一些测试方法来执行复杂的计算:


5.从文件菜单创建DLL。您可能需要以管理员身份运行,以便它可以注册DLL

6.在使用它的项目中,添加对DLL的引用

测试代码:

Private Sub Command1_Click()
     Dim vb6 As New VB6DLL.VB6Class

     Dim var0 As String
     Dim var1 As Integer
     Dim var2 As Long

     var0 = vb6.GetAString(0)
     var1 = vb6.DoubleMyInt(2)
     var2 = vb6.DoubleMyLong(1234)

      Debug.Print "GetAString == " & var0
      Debug.Print "DoubleMyInt == " & var1
      Debug.Print "DoubleMyLng == " & var2
End Sub
结果:

GetAString==Alpha
DoubleMyInt==4
DoubleMyLng==2468

不确定如何处理“卡车装载的其他东西”。

一个指向标准DLL的链接,它看起来比您发布的链接更简单。我可以说,如果Mike Strong(“strongm”)发布代码,它也可以工作。你可能想看看

但是,如果您能够的话,使用COM可能更好:它更容易设置(显然),而且它还具有一些跟踪对象接口的标准功能,这些功能内置于VB6中。例如,当您使用
TypeOf
关键字时,VB6实际上会对对象的QueryInterface方法进行内部调用,该方法保证作为COM规则之一存在(并且,如果在引用标准DLL对象时使用该关键字,则会出现错误)

VB6通过将类的Instance属性设置为GlobalMultiUse来执行“静态”类。警告:“static”关键字在VB6中具有完全不同的含义:静态局部变量的值在方法调用之间保持不变。

指向标准DLL的链接,它看起来比您发布的链接更简单。我可以说,如果Mike Strong(“strongm”)发布代码,它也可以工作。你可能想看看

但是,如果您能够的话,使用COM可能更好:它更容易设置(显然),而且它还具有一些跟踪对象接口的标准功能,这些功能内置于VB6中。例如,当您使用
TypeOf
关键字时,VB6实际上会对对象的QueryInterface方法进行内部调用,该方法保证