You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VB2012调用C++ DLL时如何通过类对象传递并访问公共变量

VB2012调用C++ DLL传递自定义类型实现数值计算

直接跨语言传递VB类对象不可行——VB和C++的对象内存模型、调用机制不兼容,原代码的写法会导致内存访问错误。下面是可行的实现方案:

核心思路

用固定内存布局的结构体替代类传递数据:结构体是值类型,VB和C++可保证内存布局一致,适合跨语言数据交互;同时严格匹配调用约定和数据类型。

1. VB2012代码实现

' 定义和C++完全匹配的结构体,成员顺序、类型必须一致
Structure Struct_Fred
    Public var_1 As Integer ' 对应C++的int
    Public var_2 As Integer
End Structure

' 声明C++ DLL导出的函数,指定调用约定为StdCall(VB默认调用约定)
Declare Sub heavyLifter Lib "YourDllName.dll" (ByRef cf As Struct_Fred)

' 调用示例
Module MainModule
    Sub Main()
        Dim fred As Struct_Fred
        fred.var_1 = 10
        fred.var_2 = 20
        
        heavyLifter(fred) ' 传递结构体引用
    End Sub
End Module

2. C++ DLL代码实现

#include <windows.h>

// 定义和VB结构体完全匹配的C++结构体,成员顺序、类型必须一致
struct Struct_Fred {
    int var_1;
    int var_2;
};

// extern "C"避免C++名字修饰,__declspec(dllexport)标记导出函数,__stdcall匹配VB调用约定
extern "C" __declspec(dllexport) void __stdcall heavyLifter(Struct_Fred* cf) {
    if (cf != nullptr) {
        int a = cf->var_1 + cf->var_2;
        // 在此添加你的数值计算逻辑
    }
}

关键注意事项

  • 类型严格匹配:VB的Integer对应C的int(32位),Long对应C的long(32位),Double对应C++的double,必须完全对应,否则会出现内存错位。
  • 调用约定一致:VB默认使用StdCall,C++导出函数必须加上__stdcall,否则会导致栈溢出或调用失败。
  • 类对象传递备选方案:若必须传递VB类对象,需将C++逻辑封装为COM组件,通过COM接口让VB访问——这种方式复杂度更高,适合需要频繁调用类方法的场景,简单数值传递优先用结构体。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 05:35:12