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]