【问题标题】:How can I create a standard DLL in VB6?如何在 VB6 中创建标准 DLL?
【发布时间】:2023-03-22 10:10:01
【问题描述】:

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

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

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

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

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

现在由我来创建一个 DLL 文件(不是设备驱动程序),它能够促进新设备(希望是旧设备)和VB6 应用程序。

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

我非常熟悉 HID.dllSetupAPI.dll P/Invokes 以及完成这项工作所必需的结构,我什至有幸偶然发现了 this,它有一些 VB6 代码这有助于读取/写入连接到系统的 HID。我对此进行了测试,并且(有点烦躁)它对我们的设备开箱即用。但这对我没有帮助,因为我无法将模块编译成 DLL 文件(更不用说找出 VB6 中的事件和一大堆其他东西了,但我已经超前了)。

我有 readtried 几种不同的方法,虽然它们被证明很有希望,但它们没有奏效。

谷歌也给我带来了很多红鲱鱼,而且总体上没有多大帮助。

如果有必要,我什至会用 C/C++ 编写它(尽管如果有其他方式我宁愿不这样做)。

那么我正在尝试做的事情可能吗?有人可以指导我逐步完成这类事情吗?

编辑 1:

稍微解释一下,当我说“他们没有工作”时,我的意思是在第一个链接的情况下,程序仍然找不到函数(带有类似“函数入口”的错误消息未找到点”),在第二种情况下,我在尝试调用函数时始终反复收到内存写入错误(不好玩)。

【问题讨论】:

  • they didn't work 你可能想解释一下如何等等。行星源代码链接包含一个您可以查看的项目。是制作一个 VB6 DLL 还是让 VB6 用一些 HID 做你想做的事情?
  • @Plutonix 主要问题是制作 VB6 DLL。
  • @Will:没有“VB6”DLL -> 这是一个 ActiveX DLL。要创建“标准”(=no ActiveX)DLL,请参阅 BobRodes 的最佳答案。

标签: dll vb6


【解决方案1】:

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

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

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

【讨论】:

  • Static local variables' values persist between method calls :所以如果我说Public Sub Foo( ) Dim x as Integer x = 1 End Sub 那么下次我打电话给Foo 时,x 已经(仍然)是 1?
  • 不,但如果你说Static x as Integer 它会。 :) 例如,这是计算调用方法次数的好方法。
【解决方案2】:

1. 在 1998 年获得 VB6 副本之后,开始一个新的 ActiveX DLL 项目:

2. 为野兽的名字编辑项目属性。

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

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. 它必须是 ActiveX DLL? (在这一点上,它正在争论语义,我真的不在乎而不伤害自己,主要是好奇)。 2. 类可以是静态的吗?
  • 不,它不一定是 ActiveX DLL,尽管答案是向您展示如何做到这一点。 Here's 一个使用 VB6 创建标准 DLL 的方法的链接,方法是深入底层并调整发送到链接器的命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
相关资源
最近更新 更多