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)即可。
故在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)即可。
相关文章推荐
- VB调用VC++的DLL问题:原因可能是托管的PInvoke 签名与非托管的目标签名不匹配。请检查PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配。
- VB调用VC++的DLL问题:1.无法返回参数,2.找不到入口点
- VB调用VC DLL的参数问题
- 在非VS环境下C++ Builder,Delphi,VC,VB等调用C#开发的DLL的完整方法
- (原创)VB调用DLL(VC)使用结构体参数时的内存对齐及分配的问题.
- VB创建ActiveX dll 的COM服务器,VC调用VB COM方法
- VB中调用vc++ DLL文件中的函数问题
- vc调用vb DLL方法
- vb调用vc dll
- Vb.net调用C写的Dll含结构体指针参数的方法
- VS2010开发——vc++项目编写DLL提供vb.net调用
- 调用32位dll的方法问题和解决方法
- 一步一步教你用VC和VB调用C DLL
- 使用QT+MinGW编写动态库dll供VC或VB调用
- VB调用VC dll的返回方式
- C++Builder调用VC生成的DLL方法
- VS开发环境下生成和调用dll出现的问题和解决方法-1
- c#的调用VC的dll输出参数的问题
- 让 Windows7 - 64bit 支持 VC++ 6.0 的解决方法(无法启动此程序,因为计算机中丢失 MSVCRTD.dll。尝试重新安装该程序以解决此问题)
- vc调用dll的两种方法