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

如何在VB6中创建包装DLL/类型库?,vb6,dll,typelib,Vb6,Dll,Typelib,,我问我为什么在尝试从DLL调用函数时总是收到错误消息错误的DLL调用约定。普遍的共识是,我需要将调用约定更改为cdecl。有道理 不幸的是,我不能把它放在函数声明中。我必须“创建一个包装器DLL”或“为DLL创建一个类型库” 我对VB非常不熟悉,因为我工作的重点是C语言,这是很长一段时间以来第一次使用这种语言。我不知道该如何完成这项任务 对于包装器DLL如何帮助事情,我也感到困惑。假设我不能在代码中用cdecl修饰函数导入,但如果我将确切的函数导入移动到一个新的VB6 DLL,然后引用该DLL

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

不幸的是,我不能把它放在函数声明中。我必须“创建一个包装器DLL”或“为DLL创建一个类型库”

我对VB非常不熟悉,因为我工作的重点是C语言,这是很长一段时间以来第一次使用这种语言。我不知道该如何完成这项任务


对于包装器DLL如何帮助事情,我也感到困惑。假设我不能在代码中用cdecl修饰函数导入,但如果我将确切的函数导入移动到一个新的VB6 DLL,然后引用该DLL,它会突然工作?

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

为此创建VB6包装的唯一优点是,可以更容易地从VB6IDE中调试调用程序,而CDecl在VB6IDE中没有任何作用。包装器将很小,并且作为本机代码DLL创建一次,使CDecl在那里有效

有关更多答案,请参阅其他帖子。我怀疑你真正的问题在于你没有传递正确的论点。

我实际上认为这个问题更适合这个话题

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

也许您在问如何将这些文件移动到dll中?如果是这种情况,则需要创建“ActiveX Dll”类型的新项目。把它命名为PwrUSB。接下来,向PwrUSBApi之类的对象添加一个类(或者重命名默认/空的类,如果提供的话)。接下来,在properties窗口中,将该类设置为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)

祝你好运。

Bob回答中真正重要的一点是,它“突然”起作用,因为你将包装器编译为本机代码。然后你从主程序中引用包装器DLL,可以正常开发和调试。你肯定不能使用typelibs来解决你的cdecl问题。谢谢,这对我很有用。我只需要使用VarPtr(array(0))传递一个指向字节数组的指针。