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中的声明 | 结果 |
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 | 结果为 Long 类型的表达式 |