TL:DR; 如何将VB6模块文件编译成标准DLL,我可以在多个VB6应用程序中使用?
我的任务是支持使用VB6编写的多个遗留应用程序。
所有这些应用程序都使用了我的雇主构建的硬件。在我为雇主工作之前,他已经将为该项目开发DLL的工作外包给一家不再能够支持它的公司,因为为THEM工作的个人最近辞职,没有其他人能够解决它进行。
我的雇主最近升级了我们的硬件,所以更糟糕的是 - 公司提供给我们的DLL也不再有用。
向我们发布了 NEW 硬件的公司没有向我们发布能够在VB6中运行的DLL文件,这进一步加剧了这一事实。
现在我可以创建一个DLL文件( NOT 一个设备驱动程序),它能够促进新(有希望是旧的)设备之间的通信。 VB6应用程序。
我对VB6的了解至多是有限的。我对.Net非常熟悉,并且在.Net中创建DLL方面取得了很大的成功,但是当谈到VB6时,我知道足够了。我正在这里进入未知领域。
我很熟悉HID.dll
和SetupAPI.dll
P / Invokes和结构所需的结构,我甚至有幸偶然发现this一个VB6代码的工作位,便于读/写连接到系统的HID。我对此进行了测试并且(有点烦躁不安)它可以为我们的设备提供开箱即用的功能。但这对我没有帮助,因为我无法将模块编译成DLL文件(更不用说计算VB6中的事件和其他东西的卡车负载,但我已经领先于自己了。)
我read和tried有几种不同的方法,虽然它们很有前景,但它们没有用。
谷歌也淹没了许多红色鲱鱼,并且一般都没有太大的帮助。
如果有必要,我甚至会用C / C ++编写它(尽管如果还有其他方法我宁愿不写)。
我正在努力做到这一点?对于这类事情,有人可以指导我一步一步吗?
要说明一点,当我说“它们不起作用”时,我的意思是在第一个链接的情况下,程序仍然无法找到该函数(带有“函数入口”之类的错误消息点找不到“)并且在第二种情况下,我在尝试调用函数时一直反复收到内存写入错误(不好玩)。
答案 0 :(得分: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 :(得分:2)
Here's指向标准DLL的方法的链接,看起来比您发布的链接更直接。我可以说,如果Mike Strong(" strongm")发布代码,它也有效。你可能想看看它。
然而,如果您能够使用COM,可能会更好:它更容易设置(显然),并且它还具有一些标准功能来跟踪对象&#39 ; s接口,内置于VB6中。例如,当您使用TypeOf
关键字时,VB6实际上对对象的QueryInterface方法进行内部调用,该方法保证作为COM的一个规则存在(如果使用关键字,在对标准DLL对象的引用中,您将收到错误)。
VB6"静态"通过将类的Instancing属性设置为GlobalMultiUse来创建类。警告:"静态"关键字在VB6中有完全不同的含义:静态局部变量'方法调用之间的值仍然存在。