【发布时间】: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 作者寻求帮助。