3

在我之前的问题中,我问为什么我bad DLL calling convention在尝试从 DLL 调用函数时不断收到错误消息。普遍的共识是我需要将调用约定更改为cdecl. 说得通。

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

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

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

4

2 回答 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)

祝你好运。

于 2012-12-18T13:36:11.827 回答
1

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

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

有关其他答案,请参阅您的其他线程。我怀疑你真正的问题是你没有通过正确的论点。

于 2012-12-17T19:07:57.350 回答