如何在VB6中创建包装器DLL/类型库?

3

在我的上一个问题中,我问为什么在尝试调用来自DLL的函数时一直收到错误消息bad DLL calling convention。普遍意见是我需要将调用约定更改为cdecl。有道理。

不幸的是,我不能将其放在函数声明导入的位置。我必须要么“创建包装DLL”,要么“为DLL创建类型库”。

由于我主要关注C#,而且这是很长一段时间以来第一次使用VB,因此我对VB非常陌生。我不确定如何完成此任务。

我也不明白包装DLL如何有助于解决问题。据说我无法在代码中使用cdecl修饰函数导入,但是如果我将该精确的函数导入移动到新的VB6 DLL中,然后引用该DLL,它突然就起作用了?


Bob的回答中真正重要的一点是,由于您将包装器编译为本机代码,因此它“突然”起作用。然后,您可以从主程序引用该包装器DLL,并可以正常开发和调试。 - prprcupofcoffee
你绝对不能使用类型库来解决你的cdecl问题。 - wqw
2个回答

4

我认为这个问题更适合讨论。

总之,你可以在函数声明导入中“放置它”,但VB6 IDE不知道如何调试这样的东西。但是编译器可以很好地处理它。一旦将其编译成dll,那么您的主项目就可以访问已编译的功能。

也许您正在询问如何将它们移动到dll中?如果是这种情况,您需要创建一个类型为“ActiveX Dll”的新项目。将其命名为PwrUSB之类的名称。接下来,添加一个类(如果提供了默认/空类,则重命名该类)以类似PwrUSBApi的名称。接下来,在属性窗口中,将类设置为GlobalMultiUse。在一个名为MDeclares的模块中,放置所有声明:

'from your other post...
Public Declare Function InitPowerDevice CDecl Lib "PwrDeviceDll.dll" (ByRef firmware() As Byte) As Long

回到你的PwrUSBApi类中:
'forward your calls to the dll
Public Function InitPowerDevice (ByRef firmware() As Byte) As Long
   InitPowerDevice  = MDeclares.InitPowerDevice(firmware)
End Function

你可以从API中创建一个更完整的对象模型,但在你解决所有API之前,我建议从这个简单的包装器开始。噢,对了,在你的主项目中,你需要在“项目”菜单中添加对新包装器PwrUSB.dll的引用。然后在代码中使用它,像这样:
Dim numOfDevices as Long 
Dim firmware() As Byte
Redim firmware(0 to 31)
numOfDevices = PwrUSB.InitPowerDevice(firmware)

祝你好运。


谢谢,这对我有用。我只需要传递一个指向字节数组的指针,使用VarPtr(Array(0))。 - M Granja

1

在VB6中的包装器DLL仍需要使用CDecl修饰符,否则需要创建一个typelib来处理DLL的函数签名。

创建VB6包装器的唯一优点是可以更轻松地从VB6 IDE内部调试调用程序,因为CDecl在其中没有效果。包装器将很小,并且作为本机代码DLL创建,使CDecl在其中有效。

有关其他答案,请参见您的其他线程。我怀疑您真正的问题是未传递正确类型的参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接