2011-04-22 33 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

相關問題