回 帖 发 新 帖 刷新版面

主题:api函数声明时,为何必须指定别名呢?

api函数声明时,为何必须指定别名呢? 
而且别名必须是原api函数名加一个大写的A,小写的都不行,这是规定吗?为什么, 
我还发现,有的api函数声明时不用给别名,可是有的api函数必须指定别名,否则执行结果就是错的。 
比如下面这个函数,就必须指定别名才行。 

Private Declare Function GetCurrentDirectory Lib "kernel32" Alias "GetCurrentDirectoryA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long

回复列表 (共4个回复)

沙发

如果调用的 API 函数要使用字符串,那么在声明语句中必须增加一个Alias子句,以指定正确的字符集。包含字符串的Windows API函数实际有两种格式:ANSI格式Unicode格式。因此,在Windows头文件中,每个包含字符串的函数都同时有 ANSI版本和Unicode版本。
  例如,下面是SetWindowText函数的两种C语言描 述。可以看到,第一个描述将函数定义SetWindowTextA, 尾部的"A"表明它是一个ANSI函数:
  
  SetWindowTextA(HWND hWnd,LPCSTR lpString);

  第二个描述将它定义为SetWindowTextW,尾部的 "w"表明它是一个Unicode函数:
    
    SetWindowTextW(HWND Hwnd,LPCWSTR lpString);

    因为两个函数实际的名称都不是"SetWindow Text",要引用正确的函数就必须增加一个Alias子句:

    Private Declare Function SetwindowText Lib "user32" Alias "SetWindowTextA"(ByVal hwnd As Longg,ByVal lpString As String) As Long

    请注意, Alias子句后面的字符串必须是函数的真正名称,必须是区分大小写的。

板凳

不一定要别名,当别名了函数名一样进,VB会自动去掉别名,你可以试试

新年快乐!

3 楼

[quote]不一定要别名,当别名了函数名一样进,VB会自动去掉别名,你可以试试

新年快乐![/quote]
确实是这样,但是我试过,不加别名确实不行,结果不对呀。
可是从api浏览器中拷入后,VB6会自动去除别名,不知为什么?

4 楼

那只能说明函数的声明是错的,看下面这个小例子

Private Declare Function GetWindowTextA Lib "user32.dll" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Private Sub Command1_Click()
    Dim s As String * 10
    GetWindowTextA Text1.hwnd, s, 10
    s = Left(s, InStr(s, Chr(0)))
    MsgBox s
End Sub

我来回复

您尚未登录,请登录后再回复。点此登录或注册