如何在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++里的HWND和char*都是传指针的值,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




