vba 交叉表查询_VBA到C的交叉

vba 交叉表查询

总览

从本质上讲,Visual Basic类型语言和c类型语言是完全不同的。 在Visual Basic类型语言中,处理数据的步骤已删除,而c类型语言使您不知所措,难以理解数据及其引用方式。 让我尝试解释一下我的意思。 为了简化下面的解释,我将Visual Basic类型语言简称为VB,将c类型语言简称为C。我理解c类型语言通常将小写形式用于此类引用,但在这里我指的是整个大量的语言组合在一起,因此我将继续使用大写形式。

说明

在VB中,字符串值被引用为单个对象。 变量名称将其作为不可分割的项目引用。 另一方面,在C中,字符串是由指向该字符串第一个字符的指针处理的。 除非使用指针指示符(c中的*),否则对变量值的任何引用都将返回,而不是字符串的任何字符,而是仅返回可以在内存中顺序找到这些字符的地址。 同样在C语言中,字符串的长度由第一个NullChar字符相对于字符串起始位置的位置确定。 我使用NullChar表示值为零的单个字符位置。 这与Null的概念完全不同,Nulls的解释在这里不适用。 在VB中,字符串存储为字符列表,但具有一个单独的Word(16位)值表示字符串的长度。 因此,字符列表最后不需要多余的NullChar。

在这一点上,我将对在VB和C中如何调用过程进行一些解释。如果我弄错了任何细节,请随时发表评论并进行更正。 自从我在C语言中做过认真的工作以来已经有很长时间了,而从不需要VB中的全面了解。 所以,这里...

要了解的第一个想法是如何使用堆栈将值和变量从调用代码传递给被调用过程。 为了理解这一点,有必要了解那些仅在被调用进程本身中使用的参数与在那里使用但其结果值也应可供调用方使用的参数之间的区别。 以最简单的形式,将再次需要返回的那些作为指针值传递,而在实际情况下不被使用的那些作为指针值本身传递。

因此,在C中您可能会看到类似以下内容的内容:

dword myfunc(dword x, dword* y, char* z)
x是32位数值。 首先将其作为x的值推入堆栈。

y也是32位数字-但是该过程期望

y的地址而不是其值。 因此,该地址接下来被压入堆栈。

z是String或char指针。 该地址最后被压入堆栈。

在VB中,您可能会看到类似以下内容的内容:

Function MyFunc(ByVal lngX As Long, ByRef lngY As Long, ByVal strZ As String) As Long
lngX是32位数字值。 首先将其作为lngX的值推送到堆栈中。

lngY也是一个32位数字值-但是

ByRef该过程期望的是lngY的地址而不是其值。 因此,该地址接下来被压入堆栈。

strZ是一个字符串。 该地址最后被压入堆栈。

我不会详细介绍如何处理字面值(或其他定义为不更新的值),但是编译器可确保即使通过地址传递的值也无法进行更改,否则,那是可能的。

当被调用过程获得控制权时,它将以相反的顺序从堆栈中弹出值,并按声明中的指定使用它们。

到现在为止,您已经注意到C对字符串的处理方式有所不同,因此在VB中,如果要使用为C设计的过程,则必须在通过在末尾添加NullChar来传递现有字符串之前,准备好现有字符串。 对于返回的String值,有时可能会单独给定一个长度,但是您始终必须使用类似

Left()将正确的String值分配给变量。 规则

在这里,我将指出当您正在处理期望与C代码接口的标准(Non-VB)库时,如何在VB中声明某些内容。 我正在谈论的那种程序的一个例子是

RegEnumValue函数 。 请注意, 语法有一个中间列,指示期望的信息类型。 下面,我将尝试为每种类型指示应如何从VB调用它。

注意 每个指标在左栏中都有一个指示器,由于这会影响其使用方式,因此也需要考虑该指示器。 您可能会注意到,所有这些

有启动LP C型产品-为长指针。 这是因为该过程会更改指向的值,并且当然,调用者和被调用者都可以访问指向的同一内存。
 C Type      VB Type         Desc                        Explanation 
HKEY                        Hive Key                    Same as DWORD
DWORD       ByVal Long      Double Word                 32-bit value itself
LPTSTR      ByVal String    Long Pointer to String      32-bit pointer to first char of String
LPDWORD     ByRef Long      Long Pointer to Long        32-bit pointer to 32-bit value
NULL        ByVal Long      Long Pointer to anything    *See below
*This is a special case so is treated the same as a DWORD with a value of 0.  This is interpreted as a pointer to 0 - or Null Pointer.
当您传递任何形式的String时,您需要确保它以NullChar终止。 更重要的是,请务必非常注意用于指定字符串长度的任何参数-甚至尤其是要返回的最大字符串长度值。 当传递一个希望被调用过程自己填充的String参数时,请记住,它将期望有一个缓冲区可以将其值复制到其中。 至关重要的是,如果您不希望整个项目崩溃或烧毁,请事先准备一个足够大的空间来处理可能引发的任何问题。 有时,过程具有一个参数,通过该参数可以指定应允许使用的最大字符串长度,但有时则不可以。 保守一点,确保你总是允许很多。 在VB中执行此操作的一个好方法是在尝试传递它之前说strX = Space(255) 结论

尽管这看起来很尴尬和复杂,但遵循上面的一些简单规则,我们

可以使用为从VBA内部与C交互而构建的过程。

翻译自: https://bytes.com/topic/access/insights/970184-vba-c-crossover

vba 交叉表查询

你可能感兴趣的:(vba 交叉表查询_VBA到C的交叉)