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

来源:本网整理

1、打开excel表格,在单元格中输入需要筛选同样类型和计算求和的数据,选中单元格。2、然后点击上方工具栏中的“插入”,并选择“数据透视表”。3、然后在弹出的对话框中点击“确定”。4、在页面右侧将需要筛选和求和的数据项目拖入相应的栏目中。5、即可对需要显示的相同项目进行筛选操作,然后对筛选后的结果进行求和操作www.zgxue.com防采集请勿采集本网。

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

1、int rf_load_key(unsigned char *_NKey);这个函数在VB中的声明是:

使用sumif函数;数据→合并计算;分类汇总;你的表格不是很规范,需要将表格整理成两列,第一列是分类,第二列是数据。以上发法打字说不清楚,你可以把你的表格发给我,我帮你把步骤写入你表格。

Declare Function rf_load_key Lib "mwrf32.dll" (ByRef nkey As Byte) As Integer

1、打开一个excel表,需要在另一个表中匹配出相应同学的班级信息。2、我们把光标定位在需要展示数据的单元格中,如下图所示。3、在单元格中输入“=vl”,然后会自动提示出VLOOKUP函数,双击蓝色

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

让excel中同一列的数据相加: 1、打开需要同一列数据相加的EXCEL表格,如抄图。2、鼠标点击并拖动,选择需要相加的数据单元格。知 3、点击菜单栏“道公式”,在“公式”下,找到“自动求和”。4

2、int rf_read(unsigned char *_Data);这个函数在VB中声明是:

3、在弹出来的对话框中选择函数类型为【求和】分别添加所有引用数据。4、并勾选标签位置区域中的【首页】和【最左列】,点击【确定】,即可完成所有数据的合并。5、点击确定后,返回单元格,合并汇总就

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

选中全表,数据、筛选、自动筛选,点C列三角形,自定义,包含,YS,确定。选中筛选后D列所有单元格,按ALT+分号键,在编辑栏输入: 雨水 按CTRL+ENTER.

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) c_a_3();

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)

用EXCEL2007打开你的表格文件,用多条件求和函数SUMIFS(要求和的范围,条件的范围1,条件1,条件的范围2,条件2,条件的范围3,条件3,…)可以实现你的要求内容来自www.zgxue.com请勿采集。

免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
Copyright © 2017 www.zgxue.com All Rights Reserved