2012-12-17 36 views
3

In my previous question,我问我为什么在试图从DLL调用函数时不断收到错误消息bad DLL calling convention。普遍的共识是我需要将调用约定改为cdecl。说得通。如何在VB6中创建包装DLL /类型库?

不幸的是,我不能把它放在函数声明输入。我不得不“创建封装器DLL”或“为DLL创建一个类型库”。

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

我也困惑包装DLL如何帮助的东西。据说我不能在我的代码中装饰一个带有cdecl的函数导入,但如果我将这个确切的函数导入到一个新的VB6 DLL中,然后引用该DLL,它会突然生效?

+0

Bob的答案中非常重要的一点是,它“突然”起作用,因为您将包装器编译为本地代码。然后,从主程序引用该包装器DLL,并且可以正常开发和调试。 – prprcupofcoffee

+0

您肯定无法使用typelib来解决您的cdecl问题。 – wqw

回答

4

我其实认为this问题在这个话题上更好。

综上所述,你可以“把它放在那里的函数声明进口”,但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) 

祝你好运。

+0

谢谢,它为我工作。我只需要使用VarPtr(Array(0))来传递指向字节数组的指针。 –

1

VB6中的包装器DLL仍然需要使用CDecl装饰器或者创建的Typelib来处理DLL的函数签名。

为此创建一个VB6包装的唯一好处是使它更容易从VB6 IDE中调试调用程序,其中CDecl无效。包装将会很小,并且会以原生代码DLL的形式创建一次,从而使CDecl在那里生效。

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