【问题标题】:How to create a wrapper DLL/Type Library in VB6?如何在 VB6 中创建包装 DLL/类型库?
【发布时间】:2012-12-17 18:50:21
【问题描述】:

In my previous question,我问为什么我在尝试从 DLL 调用函数时不断收到错误消息 bad DLL calling convention。普遍的共识是我需要将调用约定更改为cdecl。有道理。

不幸的是,我不能将它放在函数声明导入中。我不得不“创建一个包装 DLL”或“为 DLL 创建一个类型库”。

我对 VB 非常陌生,因为我工作的主要重点是 C#,这是很长时间以来第一次使用该语言。我不确定如何完成这项任务。

我也对包装 DLL 如何提供帮助感到困惑。假设我不能在我的代码中使用cdecl 修饰函数导入,但是如果我将该确切的函数导入移动到新的 VB6 DLL 然后引用该 DLL,它会突然起作用吗?

【问题讨论】:

  • 鲍勃回答中真正重要的一点是,它“突然”起作用了,因为您将包装器编译为本机代码。然后你从你的主程序中引用那个包装器DLL,就可以正常开发和调试了。
  • 你肯定不能使用类型库来解决你的 cdecl 问题。

标签: vb6 dll typelib


【解决方案1】:

我实际上认为this 的问题在这个主题上更好。

总而言之,您可以“将其放在函数声明导入处”,但 VB6 IDE 不知道如何调试这样的事情。但是 compiler 可以很好地处理它。将其编译为 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)) 传递一个指向字节数组的指针。
【解决方案2】:

VB6 中的包装 DLL 仍然需要使用 CDecl 装饰器,或者创建一个类型库来处理 DLL 的函数签名。

为此创建 VB6 包装器的唯一优点是更容易从 VB6 IDE 中调试调用程序,其中 CDecl 不起作用。包装器很小,并且作为本机代码 DLL 创建一次,使 CDecl 在那里有效。

查看您的其他主题以获得更多答案。我怀疑你真正的问题是你没有传递正确的论点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2011-04-18
    • 2012-03-17
    • 2015-11-12
    • 1970-01-01
    相关资源
    最近更新 更多