2011-04-22 28 views
2

功能我有VBA的MS Access形式的代码,在那里我键入下面的函数声明:使用别名关键字来声明在VBA

Public Declare Function GetUserName Lib "advapi32.dll"() Alias "GetUserNameA" (ByVal lpBuffer As String, nSize As Long) As Long 

但是我对Alias得到一个错误。为了使用它,我必须添加一些参考吗?

回答

6

不,没有专门的库需要使用Alias;这都是内置于语言中的。

但是你的声明是错误的。在Alias之前放置了一组额外的括号,这些编译器令编译器感到困惑。

除了纯语法,第二个参数(nSize)实际上是一个指针Long,这意味着需要ByRef通过它在VBA。

因此,修订后的声明是这样的,而不是:

Public Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _ 
     (ByVal lpBuffer As String, ByRef nSize As Long) As Long 

的返回值是1,如果函数成功,或者0,如果它失败。

+1

声明一个API functino'作为布尔值'是一个矫枉过正的IMO。 “正确的”VB布尔值被限制为0/-1,但是你可以使用'CopyMemory'来强制任何值,非零为真。这就是API声明中的'Boolean Boolean' - 将布尔中的1隐藏起来。在bool表达式中使用这样的“黑客”值可能会产生奇怪的副作用,比如在两个变量中“bValue1和bValue2”都是错误的。 – wqw 2011-04-23 08:57:22

+0

@wqw非常正确。当bValue也为真时,它也可能导致Not bValue为真。不要在声明中使用布尔值来对付Windows API – MarkJ 2011-04-23 10:07:33

+0

VB 6真的不知道如何编组数据类型比这更好?是的,它比其他常用编程语言在内部表示的布尔数据类型不同,并且WinAPI中的BOOL不是布尔数据类型。但我从来没有遇到过让预期工作的问题。我想我的期望是人为的。以你想要的方式宣布它;如果它是“Long”,那么“TRUE”将为1,“FALSE”将为0。 – 2011-04-23 10:25:02

相关问题