In my previous question,我问为什么在尝试从DLL调用函数时,我一直收到错误消息bad DLL calling convention
。普遍的共识是我需要将调用约定更改为cdecl
。有道理。
不幸的是,我无法将其放在函数声明导入上。我不得不创建一个包装DLL"或者"为DLL创建一个类型库。"
我对VB非常不熟悉,因为我的主要工作重点是C#,这是第一次使用该语言很长一段时间。我不确定如何完成这项任务。
我也对包装器DLL如何帮助解决问题感到困惑。据说我不能在我的代码中用cdecl
修饰一个函数导入,但是如果我将那个确切的函数导入到一个新的VB6 DLL然后引用该DLL它突然起作用了吗?
答案 0 :(得分:4)
我实际上认为this问题在这个主题上更好。
总而言之,可以“将它放在函数声明导入中”,但VB6 IDE不知道如何 debug 这样的事情。但编译器处理它就好了。一旦将其编译为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。
哦,是的,回到你的主项目中,你将在Project菜单中添加一个引用你的新包装PwrUSB.dll。然后在代码中你会使用这样的东西:
Dim numOfDevices as Long
Dim firmware() As Byte
Redim firmware(0 to 31)
numOfDevices = PwrUSB.InitPowerDevice(firmware)
祝你好运。
答案 1 :(得分:1)
VB6中的包装DLL仍然需要使用CDecl装饰器或者创建的类型库来处理DLL的函数签名。
为此创建VB6包装器的唯一优势是可以更轻松地从VB6 IDE中调试调用程序,其中CDecl无效。包装器很小,并且作为本机代码DLL创建一次,使CDecl在那里有效。
请参阅您的其他主题以获取其他答案。我怀疑你真正的问题是你没有传递正确的论点。