如何在VB6中创建标准DLL?

时间:2016-03-27 23:42:02

标签: dll vb6

TL:DR; 如何将VB6模块文件编译成标准DLL,我可以在多个VB6应用程序中使用?

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

所有这些应用程序都使用了我的雇主构建的硬件。在我为雇主工作之前,他已经将为该项目开发DLL的工作外包给一家不再能够支持它的公司,因为为THEM工作的个人最近辞职,没有其他人能够解决它进行。

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

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

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

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

我很熟悉HID.dllSetupAPI.dll P / Invokes和结构所需的结构,我甚至有幸偶然发现this一个VB6代码的工作位,便于读/写连接到系统的HID。我对此进行了测试并且(有点烦躁不安)它可以为我们的设备提供开箱即用的功能。但这对我没有帮助,因为我无法将模块编译成DLL文件(更不用说计算VB6中的事件和其他东西的卡车负载,但我已经领先于自己了。)

readtried有几种不同的方法,虽然它们很有前景,但它们没有用。

谷歌也淹没了许多红色鲱鱼,并且一般都没有太大的帮助。

如果有必要,我甚至会用C / C ++编写它(尽管如果还有其他方法我宁愿不写)。

我正在努力做到这一点?对于这类事情,有人可以指导我一步一步吗?

编辑1:

要说明一点,当我说“它们不起作用”时,我的意思是在第一个链接的情况下,程序仍然无法找到该函数(带有“函数入口”之类的错误消息点找不到“)并且在第二种情况下,我在尝试调用函数时一直反复收到内存写入错误(不好玩)。

2 个答案:

答案 0 :(得分:2)

1。在您1998年获得VB6副本之后,启动一个新的 ActiveX DLL 项目:

enter image description here

2. 编辑项目属性以获取野兽的名称。

3. 为您正在创建的界面添加一个类。我巧妙地命名了类VB6Class,因为项目/ DLL名为VB6DLL。

enter image description here

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

Option Explicit

Public Function GetAString(ByVal index As Integer) As String
    Dim ret As String

    Select Case index
        Case 0
            ret = "Alpha"
        Case 1
            ret = "Beta"
        Case Else
            ret = "Omega"
    End Select

    GetAString = ret
End Function

Public Function DoubleMyInt(ByVal value As Integer) As Integer  
    DoubleMyInt = (2 * value)    
End Function

Public Function DoubleMyLong(ByVal value As Long) As Long 
    DoubleMyLong = (2 * value)
End Function

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 :(得分:2)

Here's指向标准DLL的方法的链接,看起来比您发布的链接更直接。我可以说,如果Mike Strong(" strongm")发布代码,它也有效。你可能想看看它。

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

VB6"静态"通过将类的Instancing属性设置为GlobalMultiUse来创建类。警告:"静态"关键字在VB6中有完全不同的含义:静态局部变量'方法调用之间的值仍然存在。