首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

API函数中同一类型参数门类声明 在不同函数中转化成VB函数声明时对应不同类型的疑惑

2013-09-06 
API函数中同一类型参数类型声明 在不同函数中转化成VB函数声明时对应不同类型的疑惑1、int rf_load_key(uns

API函数中同一类型参数类型声明 在不同函数中转化成VB函数声明时对应不同类型的疑惑
1、int rf_load_key(unsigned char *_NKey);这个函数在VB中的声明是:
Declare Function rf_load_key Lib "mwrf32.dll" (ByRef nkey As Byte) As Integer

unsigned char *_NKey对应转化为ByRef nkey As Byte

2、int rf_read(unsigned char *_Data);这个函数在VB中声明是:
Declare Function rf_read Lib "mwrf32.dll" (ByVal sdata as string ) As Integer

unsigned char *_NKey对应转化为ByVal sdata as string 


问题有以下两个:
1、为什么同一个unsigned char *_NKey对应VB中的两个参数类型?
2、ByVal sdata as string 这种类型  怎么作为指针来使用?
[解决办法]

引用:
1、为什么同一个unsigned char *_NKey对应VB中的两个参数类型?

C 语言中字符串和字符数组是等价的,而且字符和字节没有很大的差异,所以字符串和字节数组也是等价的。
而 VB 中字符串和数组是不同的,所以就有不同的声明方式。
引用:
2、ByVal sdata as string 这种类型  怎么作为指针来使用?

参数中的字符串就是传指针,如果 ByRef 就是 char** 了。
又:C 的字符串是 Ansi 编码,VB 的字符串是 Unicode 编码,VB 在调用时会做额外处理,这个不用关心。
[解决办法]
引用:
那我怎么知道,unsigned char * 类型什么时候转换成数组,什么时候要转换成字符串呢

看文档啊!
到底传的是二进制数据还是字符串。
[解决办法]
VB中,API声明时的数据类型通常是可以不固定的,大致有两种情况:
第一,同一类型的不同表现。例如下面两个声明
Private Declare Sub CopyMemoryByVal Lib "kernel32" Alias "RtlMoveMemory" ( _
                        ByVal Dst As Long, _
                        ByVal Src As Long, _                        ByVal ByteCount As Long)



Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _
ByRef Destination As Any,_
ByRef Source As Any, _ByVal Length As Long)
可以看出,同一个API函数可以声明为两种数据类型。
如同你所说的例子,你可以试试声明为不同的类型,如:
Declare Function rf_load_key Lib "mwrf32.dll" (ByVal nkey As string) As Integer
Declare Function rf_read Lib "mwrf32.dll" (ByRef sdata as Byte) As Integer
应该同样可以得到正确的结果,不同的是你在VB中调用这样的函数时,传递参数的形式需要改变。

第二、由于C++具备函数重载的能力,因此一些API同样可以实现重载,记得以前写过一个代码,对于同一个API声明了不同的参数类型,也可以将其声明为Any,以减化声明和调用过程。


[解决办法]

引用:
我还有两个问题
1、参数是数组或字符串时,如何保证这些参数所分配的内存是连续的呢,如果不连续,这些参数 岂不会引起混乱
2、参数为数组或字符串时,请教一下,具体的参数调用 的形式。

1、数组和字符串的定义就是连续的。
2、
Declare Function rf_load_key Lib "mwrf32.dll" (ByRef nkey As Byte) As Integer

Dim aBytes() As Byte
Redim aBytes(99)
Debug.Print rf_load_key(aBytes(0))

Declare Function rf_read Lib "mwrf32.dll" (ByVal sdata as string ) As Integer

Dim s As String
s = Space(100)
Debug.Print rf_load_key(s)

热点排行