【问题标题】:VB6 equivalent for IntPtr usageIntPtr 用法的 VB6 等效项
【发布时间】:2018-07-22 16:40:57
【问题描述】:

我正在使用 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

但是 void* 呢?

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

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

【问题讨论】:

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

标签: c# vb6 void intptr


【解决方案1】:

为了调用 API,您需要编组 VB 整数变量的地址。这可以在调用“BS2_Initialize”时使用“sdkContext”上的“VarPtr”来完成。

例如

结果 = BS2_Initialize(VarPtr(sdkContext))

【讨论】:

    猜你喜欢
    • 2023-03-26
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多