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

用于IntPtr的VB6等效工具 我在VB6开发,我正在尝试用C++ DLL工作。 我的SDK中有C#中的示例,我正在尝试在VB6中使用以下函数:,c#,vb6,void,intptr,C#,Vb6,Void,Intptr,这是在.h文件中看到的内容: BS_API_EXPORT void* BS_CALLING_CONVENTION BS2_AllocateContext(); BS_API_EXPORT int BS_CALLING_CONVENTION BS2_Initialize(void* context); C#中的声明: C#中的用法: 现在,我尝试在VB6中执行同样的操作: 声明: Public Declare Function BS2_AllocateContext Lib "BS_SDK_V2

这是在.h文件中看到的内容:

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

C#中的用法:

现在,我尝试在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
Dim sdkContext尽可能长
sdkContext=BS2_AllocateContext()
结果=BS2_初始化(sdkContext)

为了调用API,您需要封送VB整数变量的地址。调用“BS2_Initialize”时,可以使用“sdkContext”上的“VarPtr”来完成此操作

例如


结果=BS2_初始化(VarPtr(sdkContext))

“VB6环境崩溃”不足以说明错误。您会收到什么错误消息?我刚才看到:C#BS2_Init方法返回
int
,而vb6实现返回
Long
-正确吗?或者应该是“Int”或其他什么?不确定这是否会导致一些内存访问问题…将Long更改为Integer不起作用。还是一样的问题。我就这个问题询问了设备制造商,但他说应该没有问题。崩溃是在2个不同的计算机(运行Windows 10 x64)从C++声明,我想这是BYVAL…只要是正确的VB6声明
void*
是32位实体(在VB6 32位世界中),与
Long
相同
ByRef
表示指向无效指针的指针,该指针看起来不正确。当然我可能弄错了。如果必须是ByVal,那么使用ByRef总是会使代码崩溃。C++和C语言声明都不足以诊断堆栈不平衡错误,但这可能是调用约定的问题。VB6只能调用stdcall函数。使用电话向DLL作者寻求帮助。
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