You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在VisualBasic中调用Visual Studio编写的C++ DLL?

如何在VisualBasic中调用Visual Studio编写的C++ DLL?

嘿,先看你给出的C++ DLL代码,头文件里用extern "C"避免C++的名字修饰,这一步做的很对,不然VB根本找不到对应的函数名,先把你的代码贴出来确认下:

myproject.h

#ifdef __cplusplus  // 定义为199711L
extern "C" {        // 使用C命名规则
#endif

int DLL_EXPORT InicialitzarRobot(HWND finestra_mare, char* nom_robot, int back);
// ... 其他函数

#ifdef __cplusplus
}
#endif

myproject.cpp

(只要源文件里正确实现了声明的函数即可)

接下来我给你一步步讲怎么在VB里调用这个DLL:

第一步:先搞定位数匹配

首先要确认你的C++ DLL是编译成32位还是64位的,VB的项目位数必须和它完全一致!比如VB6只能跑32位程序,那你就得把DLL编译成32位;VB.NET的话可以在项目属性里选32/64位,一定要对应上,不匹配的话直接就报错了。

第二步:在VB里声明DLL函数

根据你头文件里的InicialitzarRobot函数,要在VB里对应声明参数类型,不同VB版本写法不一样:

如果你用的是VB6

直接写这个声明(最好放在模块里,或者窗体的通用声明部分):

Declare Function InicialitzarRobot Lib "myproject.dll" (ByVal finestra_mare As Long, ByVal nom_robot As String, ByVal back As Long) As Long

注意这几点:

  • Lib后面跟着你的DLL路径,如果DLL和VB程序在同一个文件夹里,直接写文件名就行
  • 所有参数前面都要加ByVal!因为C++里的HWNDchar*都是传指针的值,VB默认是传地址,不加ByVal的话参数会传错,直接崩。

如果你用的是VB.NET

首先要导入System.Runtime.InteropServices这个命名空间,然后写:

<DllImport("myproject.dll", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi)>
Public Shared Function InicialitzarRobot(ByVal finestra_mare As IntPtr, ByVal nom_robot As String, ByVal back As Integer) As Integer
End Function

这里要注意:

  • CallingConvention.Cdecl必须加!因为Visual Studio里C++默认的调用约定是__cdecl,VB.NET默认是StdCall,不加的话会栈不平衡,程序直接崩溃
  • CharSet.Ansi对应你C++里的char*,避免Unicode和ANSI编码不匹配导致的字符串乱码问题

第三步:直接调用函数就行

现在就可以在VB代码里直接用这个函数了,举个例子:

VB6里的调用示例

Dim formHwnd As Long
formHwnd = Me.hWnd ' 拿当前窗体的句柄当参数
Dim result As Long
result = InicialitzarRobot(formHwnd, "我的机器人", 0)
If result = 0 Then
    MsgBox("机器人初始化成功啦!")
Else
    MsgBox("初始化失败,错误码:" & result)
End If

VB.NET里的调用示例

Dim formHwnd As IntPtr = Me.Handle
Dim result As Integer = InicialitzarRobot(formHwnd, "我的机器人", 0)
If result = 0 Then
    MessageBox.Show("机器人初始化成功啦!")
Else
    MessageBox.Show($"初始化失败,错误码:{result}")
End If

几个容易踩的坑

  • 位数不匹配:这个是最常见的,比如32位DLL跑在64位VB程序里,直接就弹出“找不到模块”的错误,一定要对应好
  • 调用约定不对:刚才说的C默认__cdecl,VB6默认StdCall,如果你的DLL没改调用约定,VB6里可能会报错,这时候要么在C里把函数声明改成__stdcall(比如int __stdcall DLL_EXPORT InicialitzarRobot(...)),要么在VB6的声明里加Alias "InicialitzarRobot"
  • 字符串乱码:C++用的char*是ANSI编码,VB默认是Unicode,所以一定要在声明里指定ANSI字符集,不然传过去的中文会变成乱码

备注:内容来源于stack exchange,提问作者DeepButi

火山引擎 最新活动