15757753770 发表于 2016-12-11 15:07:57

VB 和 vc 参数类型和传递方式 对应关系

本帖最后由 15757753770 于 2016-12-11 15:09 编辑


以下内容转载来的 部分亲测 部分未测试



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)

LPSTRlpStr      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中的声明      结果
                  
ATOM      ByVal variable As Integer      结果为Integer 类型的表达式
BOOL      ByVal variable As Boolean      结果为 Long 类型的表达式
BYTE      ByVal variable As Byte      结果为 Byte 类型的表达式
CHAR      ByVal variable As Byte      结果为 Byte 类型的表达式
COLORREF      ByVal variable As Long      结果为 Long 类型的表达式
DWORD      ByVal variable As Long      结果为 Long 类型的表达式
HWND, HDC, HMENU      ByVal variable As Long      结果为 Long 类型的表达式等Windows 句柄
INT, UINT      ByVal variable As Long      结果为 Long 类型的表达式
LONG      ByVal variable As Long      结果为 Long 类型的表达式
LPARAM      ByVal variable As Long      结果为 Long 类型的表达式
LPDWORD      variable As Long      结果为 Long 类型的表达式
LPINT, LPUINT      variable As Long      结果为 Long 类型的表达式
LPRECT      variable As type      自定义类型的任意变量
LPSTR, LPCSTR      ByVal variable As String      结果为 String 类型的表达式
LPVOID      variable As Any 任何变量(在传递字符串的时候使用ByVal)         
LPWORD      variable As Integer      结果为Integer 类型的表达式
LRESULT      ByVal variable As Long      结果为 Long 类型的表达式
NULL      As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer      结果为Integer 类型的表达式
VOID      Sub procedure      不可用
WORD      ByVal variable As Integer      结果为Integer 类型的表达式
WPARAM      ByVal variable As Long

页: [1]
查看完整版本: VB 和 vc 参数类型和传递方式 对应关系