您的位置:首页 > 编程语言 > VB

VB调用vc写的dll的某个方法时的问题

2009-08-05 14:53 381 查看
第一,鉴于VB的速度和在位操作方面的不足,我用VC来编写一个DLL来实现一些功能。输出的函数YUYVtoRGB24 是没有返回值的。

故在vb下声明用sub实现。如下,Public Declare Sub YUYVtoRGB24 Lib "ColorSpaceConverter.dll" (ByVal width As Long, ByVal height As Long, ByRef src As Byte, ByRef dst As Byte)。

vb下调用用方式YUYVtoRGB24 x, Y, pBuf(0), pDstBuf(0)或者
Call YUYVtoRGB24(1, 1, pDstBuf(0), pDstBuf(0))来调用sub过程。

可在VB中调用出错,"Bad DLL calling convention"。

查看VC调用方式为__declspec,而VB要求必须是stdcall方式,这对没有参数的函数影响不大,但对有参数的函数有影响。

修改VC程序,Project setting/C++的catagory为code generation,calling convention为_stdcall,重新编译生成dll后,vb调试通过。

第二,要注意参数声明错误,c++ int类型是32 bit有符号数,而vb下,

(1)整型(Integer)
整型数用两个字节存储,取值范围是-32768到+32767。
例如:15,-345,654%都是整数型。而45678%则会发生溢出错误。
(2)长整型(Long)
长整型用4个字节存储,取值范围是-2147483648到+2147483647。
例如:123456,45678&都是长整数型。

所以c++为int,vb对应为long。

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

第三, 数组传递值用ByRef,VB地址到VC的传递,只需要将数组第一个值得地址作为ByVal参数传递过去就可以。 VC中的数组的第一个的元素的地址传递到VB,只需要通过API函数CopyMemory就可以将整个数组拷贝到VB数组中。vb下声明如下,Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal lpvDest As Long, ByVal lpvSource As Long, ByVal cbCopy As Long),直接调用 CopyMemory lNFPara, wParam, Len(NewFramePara)即可。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: