VC与VB数据类型对应关系

VB调用C DLL时的参数传递

函数在C中的原型,参数类型和传递方式 对应关系

C DLL 原型         VB声明                 VB调用

USHORT a         ByVal a as long           Call func(…,a,…)

int a                   ByVal a as long           Call func(…,a,…)

long a                ByRef a as long          Call func(…,byval a,…)

int *pa                ByRef pa as long        Call func(…,pa,…)

long *pa             ByVal pa as long         Call func(…,varptr(pa),…)              <---------(1)

LPSTR  lpStr      ByVal lpStr as string    Call func(…,lpStr,…)

char *pstr           ByVal pstr as string    Call func(…,pstr,…)                       <---------(2)

wchar *pstr         ByRef pstr as string   Call func(…,byval pstr,…)

struct tagX *p      ByRef p as tagX         Call func(…,ptag,…)                      <---------(3) 

HANDLE h           ByVal h as long          Call func(…,h,…)                           <---------(4) 

备注  

1)不推荐使用此方式

2)如果DLL要求一个字符串缓冲区,一定要在调用前初始化字串,即dim t as string * 50

3)用户定义子类型必须用ByRef方式传递, 

4)任何内核对象的句柄(process, thread, module, file, filemapping, semaphore等)和大多数GDI对象的句柄都能用此方式传递。 

 

 

 

数组传递     

        数组传递值用ByRef

        VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。

       

         VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。

 

 

dll函数直接返回字符串

 

        VB下的字符串格式和VC中的char有些不同的

        直接返回char *是不行的,VB不支持这种做法。正如你在资料中看到,大多数都是在VB中先给字符串分配空间,再传递给VC,在DLL中可以修改字符串,但不能超过VB中分配的空间。如果你希望直接返回字符串,必须使用BSTR类型,这实际上就是VB中的字符串所使用的类型。下面是一个简单的例子: 

     

     EXTERN_C BSTR WINAPI RetStr() 

     { 

             char *str = "1234567890"; 

             return SysAllocString((BSTR)str);

      } 

或者参考一下VB下调用GetComputerName的方法.



 

 

  VC++与VB数据类型对应关系

VC++ VB
short Integer
int Long
long Long
UNIT Long
ULONG Long
WORD DWORDLong
WPARAM LPARAMLong
WMSG UMSGLong
HRESULT Long
BOOL Boolean
COLORREF Long
HWND,HDC,HBRUSH,HKEY,等等 Long
LPSTR LPCSTRString
LPWSTR,OLECHARBSTR String
LPTSTR String
VARIANT_BOOL Boolean
unsignedchar Byte
BYTE Byte
VARIANTVariant
(任何以*或**结尾的数据类型)
Long

 

c中的数据类型VB中的声明结果
   
ATOMByVal variable As Integer结果为Integer 类型的表达式 
BOOLByVal variable As Boolean结果为 Long 类型的表达式 
BYTEByVal variable As Byte结果为 Byte 类型的表达式 
CHARByVal variable As Byte结果为 Byte 类型的表达式 
COLORREFByVal variable As Long结果为 Long 类型的表达式 
DWORDByVal variable As Long结果为 Long 类型的表达式 
HWND, HDC, HMENUByVal variable As Long结果为 Long 类型的表达式等Windows 句柄 
INT, UINTByVal variable As Long结果为 Long 类型的表达式 
LONGByVal variable As Long结果为 Long 类型的表达式 
LPARAMByVal variable As Long结果为 Long 类型的表达式 
LPDWORDvariable As Long结果为 Long 类型的表达式 
LPINT, LPUINTvariable As Long结果为 Long 类型的表达式 
LPRECTvariable As type自定义类型的任意变量 
LPSTR, LPCSTRByVal variable As String结果为 String 类型的表达式 
LPVOIDvariable As Any 任何变量(在传递字符串的时候使用ByVal)  
LPWORDvariable As Integer结果为Integer 类型的表达式 
LRESULTByVal variable As Long结果为 Long 类型的表达式 
NULLAs Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer结果为Integer 类型的表达式 
VOIDSub procedure不可用 
WORDByVal variable As Integer结果为Integer 类型的表达式 
WPARAMByVal variable As Long结果为 Long 类型的表达式

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值