VB调用VC dll的返回方式

第一种类型:数值传递
注意:在VB中,默认变量传递方式为ByRef为地址,而传递值就是用ByVal,还要注意在C++中,
int类型的变量是32位的,在VB中要用long型变量来配合。
VC++部分:

  1. extern "C" _declspec(dllexport) int __stdcall TestCalc(int source)
  2. {
  3. //AFX_MANAGE_STATE(AfxGetStaticModuleState());
  4. return(++source);
  5. }

.def文件
EXPORTS TestCalc

VB部分
声明:

调用:

  1. Dim Tint As Long
  2. Tint = TestCalc(45)
  3. MsgBox Tint, vbExclamation

第二种类型:传递字符串,主要用于字符串返回或者处理。

VC++部分:

  1. extern "C" _declspec(dllexport) int __stdcall MidStr(CHAR * src,CHAR * dest)
  2. {
  3. //AFX_MANAGE_STATE(AfxGetStaticModuleState());
  4. strcpy(dest,src+1);
  5. return 0;
  6. }

.def文件
EXPORTS MidStr

VB部分:
声明:

  1. Private Declare Function MidStr Lib "Dll.dll" (ByVal src As String, ByVal dest As String) As Long

调用:

  1. Dim i As Long, s As String * 255
  2. tempstr = "Hello!World"
  3. i = MidStr(tempstr, s)  或者 i = MidStr("Hello!World", s)
  4. MsgBox s, vbExclamation

第三种类型:传递数组和变量指针,主要用于从dll中读出大量数据

VC++部分:

  1. extern "C" _declspec(dllexport) int __stdcall TestByte(BYTE *p,int *length)
  2. {
  3. //AFX_MANAGE_STATE(AfxGetStaticModuleState());
  4. *p=45;
  5. *(p+1)=46;
  6. *length=2;
  7. return 0;
  8. }

.def文件
EXPORTS TestByte
VB部分
声明:

  1. Private Declare Function TestByte Lib "Dll.dll" (ByRef src As Any, ByRef length As Long) As Long

调用:

  1. Dim a(0 To 10) As Byte
  2. Dim i As Integer, length As Long
  3. i = TestByte(a(0), length)
  4. MsgBox a(0) & " " & a(1) & vbCrLf & length, vbExclamation

第四种类型:传递字符串数组 
1、VB TO VC :
 VC部分:

  1. extern "C" _declspec(dllexport) int WINAPI StringArray(LPSAFEARRAY *VbArray)
  2. {
  3. DWORD i;
  4. BSTR bSTR;    // UNICODE 字符串
  5. LPSAFEARRAY pSa;
  6. SAFEARRAYBOUND iBound;
  7. char *arry[10];
  8. for(i = 0;i < 10;i++)
  9. {
  10. arry[i] = "A";
  11. }
  12. iBound.lLbound = 0;    // 数组起始位
  13. iBound.cElements = 10;    // 数据长度
  14. // SafeArray描述符
  15. if (*VbArray == NULL)
  16. {
  17. if ((pSa = SafeArrayCreate(VT_BSTR,1,&iBound)) == NULL)  // 创建SafeArray描述符
  18. {
  19. return FALSE;
  20. }
  21. *VbArray = pSa;                // 返回SafeArray描述符
  22. }
  23. else
  24. {
  25. if ((*VbArray)->cDims != 1)        // 释放为一维数组
  26. return FALSE;
  27. }
  28. for (i = iBound.lLbound;i < iBound.cElements;i++)
  29. {
  30. bSTR = SysAllocString((BSTR)arry[i]);
  31. //     if(FAILED(safeArrayGetElement(*VbArray,(long*)&i,&bSTR))) // 从VbArray数组读取数据
  32. //{
  33. //    return FALSE;
  34. //}
  35. // 放数组元素到VbArray数组
  36. if(FAILED(safeArrayPutElement(*VbArray,(long*)&i,bSTR)))
  37. {
  38. return FALSE;
  39. }
  40. SysFreeString(bSTR); // 释放空间
  41. }
  42. return 1;
  43. }

VB 部分:
声明:

  1. Sub StringArrayTest()
  2. Dim s()     As String
  3. tmp = StringArray(s)
  4. Debug.Print s(0)
  5. End Sub

2、VB TO VC
VB的字符串数组是由BSTR组成的SafeArray类型,所以VB里DLL函数如此声明:
Private Declare FunctionMyFun Lib "MyDll" (ByVal strarr As Variant) As Long
建立MFC DLL工程,名为 ShowVBStrArr 编译生成 ShowVBStrArr.DLL
DLL函数原形:

  1. extern "C" BOOL __stdcall ShowVBStrArray(VARIANT VBpStrArray)
  2. {
  3. SAFEARRAY FAR *pStrArrTemp = NULL;
  4. long LBound;
  5. long UBound;
  6. BSTR HUGEP *pbstr;
  7. CString strtemp;
  8. if(V_VT(&VBpStrArray) != (VT_ARRAY | VT_BSTR))//判断是否为字符数组
  9. return FALSE;
  10. pStrArrTemp = V_ARRAY(&VBpStrArray);
  11. if (SafeArrayGetDim(pStrArrTemp)!=1)//判断是否为一维数组
  12. return FALSE;
  13. SafeArrayGetLBound(pStrArrTemp,1,&LBound);
  14. SafeArrayGetUBound(pStrArrTemp,1,&UBound);
  15. SafeArrayAccessData(pStrArrTemp, (void HUGEP* FAR*)&pbstr);
  16. for (int i=0;i<(UBound-LBound)+1;i++)
  17. strtemp+=LPWSTR(pbstr);
  18. MessageBox( 0,strtemp,"结果",MB_OK);
  19. SafeArrayUnaccessData(pStrArrTemp);
  20. return TRUE;
  21. }

在DLL工程的def文件里编辑如下:
EXPORTS
ShowVBStrArray
VB源码:
Option Explicit
Private Declare Function ShowVBStrArray Lib "xxx.dll" (ByVal pstr As Variant) As Long
Private Sub Command1_Click()
Dim prompt(1) As String
prompt(0) = "Hello"
prompt(1) = "World"
ShowVBStrArray prompt
End Sub

第五种 传结构体

由于需要根据需求向DLL中传入多种值或者需要从DLL中返回多种数据,都可以传结构体,不过得注意VB和VC的类型对应。具体操作如下: VC部分:

声明:

结构体定义:

  1. // 电源报警模块 参数结构体
  2. typedef struct tagPowerAlarm
  3. {
  4. char* strSIM;       // SIM 卡号
  5. char* cStartTime;   // 开始时间
  6. char* cEndTime;     // 终止时间
  7. }PowerAlarm;
  8. // 电源报警模块 返回结果结构体
  9. typedef struct tagPowerResult
  10. {
  11. char cResultCH[20]; // 充电情况判断
  12. char cResultQuality[20]; // 电池品质判断
  13. char cResultHV[20]; // 过充判断
  14. char cResultLV[20]; // 欠压判断
  15. }PowerResult;

VB部分:

声明:

  1. Public Declare Function cPowerAlarm Lib "DataDiagnose.DLL" (ByRef myPower As h_PowerAlarm, ByRef myPowerResult As h_PowerResult) As Integer

结构体定义:

  1. ' 电源报警模块 参数结构体
  2. Public Type h_PowerAlarm
  3. strSIM     As String        ' SIM 卡号
  4. strStartTime As String      ' 开始时间
  5. strEndTime   As String      ' 终止时间
  6. End Type
  7. ' 电源报警模块 返回结果结构体
  8. Public Type h_PowerResult
  9. strResultCH As String * 20      ' 充电情况判断
  10. strResultQuality As String * 20 ' 电池品质判断
  11. strResultHV As String * 20      ' 过充判断
  12. strResultLV As String * 20      ' 欠压判断
  13. End Type

总结:

VC与VB间相互调用,可以通过VC的接口把数据传送到excel中,进行数据处理。

                                  改变自己,从现在做起-----------久馆

VC与VB的更多相关文章

  1. VC调用VB写的COM

    VB. 步骤: 1.创建类库:类库的创建必须分为接口和实现类:给外面提供的是COM接口: 创建了接口和类之后还要创建"Guid",这个在"工具->创建GUID&qu ...

  2. QT编写DLL给外部程序调用,提供VC/C#/C调用示例(含事件)

    最近这阵子,接了个私活,封装一个开发包俗称的SDK给客户调用,查阅了很多人家的SDK,绝大部分用VC编写,而且VC6.0居多,估计也是为了兼容大量的XP用户及IE浏览器,XP自带了VC6.0运行库,所 ...

  3. C++ C# VC VC.net以及VC++有什么区别和联系?

    C/C++是编程语言,C是C++的爸爸,也就是说C++从C发展而来,而C++完全兼容C的语法.国际上有一个专门管理C++的机构,它们负责C++的标准制定. VC++是微软公司的C++编译环境,使用它可 ...

  4. vb编写串口调试程序

    sub是子模块,可以调用但是没有返回值,function是有返回值的. public sub 可以在其它form里调用,而private sub 只能在当前form里调用. vb里的if else , ...

  5. 在VC中动态加载ODBC的方法

    在使用VC.VB.Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置ODBC数据源.对于一般用户而言,配置ODBC数据源可能是一件比较困难的工作.而且,在实际应用中,用户往往 ...

  6. VB和VB.NET有什么区别

    作为VB6.0的后续版本,VB.NET更加稳定,而且完全面向对象.也许你还记得,VB6.0部支持继承.重载和接口,所以不是真正面向对象的.而VB.NET则支持这些面向对象特性.VB6.0有两个薄弱环节 ...

  7. MFC,C++,VC++,VS2010 之间究竟是什么关系

    C++是在C语言的基础上发展而来的面向对象的一种语言: MFC是基于C++类的窗口开发工具,内含大量的基类.降低编程人员的工作量: VC++是一种开发工具. VS2010是更高版本号的开发工具,功能强 ...

  8. VB的使用

    一.今天讲解VB的使用,明天讲解VC与VB的相互调用: 1.指针是什么?    不需要去找什么标准的定义,它就是一个32位整数,在C语言和在VB里都可以用Long类型来表示.在32位Windows平台 ...

  9. 我大中华微软MVP中国区人才库

    刘海峰:国内知名微软开源技术网站51Aspx 创始人,十年以上的Asp.net从业经验,微软MSDN特约讲师.Teched讲师.ImagineCup大赛评委.人大出版社研修班特约讲师,曾多次受邀访问美 ...

随机推荐

  1. Jmeter CSV数据文件设置使用之一

    第一步: 在Jmeter 里,新建CSV数据文件设置,选择对应的文件,变量名称根据需要自己取,如bug,test,如下图所示: 第二步: 配置Jmetet 数据源,参数对应的名称要与CSV数据文件设置 ...

  2. Learn day9 粘包\struct用法\hashlib校验\socketserver并发\模块引入\进程\join\守护进程

    1.粘包现象 总结 : 导致黏包现象的两种情况 hello,worl d (1) 在发送端,发送数据太快,频繁发送 (2) 在接收端,接收数据太慢,延迟截取 # ### 服务端 import sock ...

  3. python使用pandas进行数据处理

    pandas数据处理 关注公众号"轻松学编程"了解更多. 以下命令都是在浏览器中输入. cmd命令窗口输入:jupyter notebook 打开浏览器输入网址http://loc ...

  4. Django项目登录注册系统

    Django项目之个人网站 关注公众号"轻松学编程"了解更多. Github地址:https://github.com/liangdongchang/MyWeb.git 感兴趣的可 ...

  5. 《Clojure编程》笔记 第2章 函数式编程

    目录 背景简述 第2章 函数式编程 背景简述 本人是一个自学一年Java的小菜鸡,理论上跟大多数新手的水平差不多,但我入职的新公司是要求转Clojure语言的.坊间传闻:通常情况下,最好是有一定Jav ...

  6. 怎么解决Git中出现 "LF will be replaced by CRLF" 警告

    Windows中使用CRLF标识一行的结束,而在Linux/UNIX系统中只使用LF标识一行的结束.CRLF即Carriage-Return Line-Feed的缩写.通常情况下,Git库不会自动修改 ...

  7. leetcode147median-of-two-sorted-arrays

    题目描述 有两个大小分别为m和n的有序数组A和B.请找出这两个数组的中位数.你需要给出时间复杂度在O(log (m+n))以内的算法. There are two sorted arrays A an ...

  8. I am coming back

    时隔两年,我回来了,回到这个我梦开始的地方,带着一个新的身份--研究生!

  9. TCP/IP协议与Socket

    1.计算机网络体系结构分层 OSI 参考模型注重"通信协议必要的功能是什么", TCP/IP 则更强调"在计算机上实现协议应该开发哪种程序". 2.TCP/IP ...

  10. CSS3:overflow属性详解

    1.Overflow overflow为溢出(容器),当内容超出容器时只需添加overflow属性值为hidden, 就可以把超出容器的部分隐藏起来: 如果内容超出容器却又不想其隐藏时可以将其属性值设 ...