VB6相当于IntPtr的用法

时间:2018-02-12 13:31:40

标签: c# vb6 void intptr

我在VB6中开发,我正在尝试使用C ++ DLL。 SDK我有C#中的示例,我试图让以下函数在VB6中工作:

这是.h文件中的内容:

BS_API_EXPORT void* BS_CALLING_CONVENTION BS2_AllocateContext();
BS_API_EXPORT int BS_CALLING_CONVENTION BS2_Initialize(void* context);
C#中的

声明:

extern public static IntPtr BS2_AllocateContext();
extern public static int BS2_Initialize(IntPtr context);

在C#中的用法:

private IntPtr sdkContext;
sdkContext = IntPtr.Zero;
.
.
sdkContext = API.BS2_AllocateContext();
result = API.BS2_Initialize(sdkContext);

现在我想在VB6中做同样的事情: 声明:

Public Declare Function BS2_AllocateContext Lib "BS_SDK_V2" () As Long
Public Declare Function BS2_Initialize Lib "BS_SDK_V2" (ByRef Context As Long) As Long

用法:

Dim sdkContext As Long
sdkContext = BS2_AllocateContext()
result = BS2_Initialize(sdkContext) 
                                  <--- VB6 environment crashes

根据我的理解,IntPtr与VB6中的Long相同

但是呢?*

(我也尝试将ByRef更改为ByVal,但我得到的是“错误的DLL调用约定”) 那为什么会崩溃?

我没有收到错误消息。整个VB6环境崩溃: “Visual Basic已停止工作 一个问题导致程序停止正常工作。 Windows将关闭....“

1 个答案:

答案 0 :(得分:0)

要调用API,您需要封送VB整数变量的地址。当调用“ BS2_Initialize”时,可以在“ sdkContext”上使用“ VarPtr”来实现。

例如

结果= BS2_Initialize(VarPtr(sdkContext))