主题:api函数声明时,为何必须指定别名呢?
ggyy66
[专家分:10] 发布于 2009-01-30 20:06:00
api函数声明时,为何必须指定别名呢?
而且别名必须是原api函数名加一个大写的A,小写的都不行,这是规定吗?为什么,
我还发现,有的api函数声明时不用给别名,可是有的api函数必须指定别名,否则执行结果就是错的。
比如下面这个函数,就必须指定别名才行。
Private Declare Function GetCurrentDirectory Lib "kernel32" Alias "GetCurrentDirectoryA" (ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
回复列表 (共4个回复)
沙发
一江秋水 [专家分:9680] 发布于 2009-01-30 22:10:00
如果调用的 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子句后面的字符串必须是函数的真正名称,必须是区分大小写的。
板凳
merry05 [专家分:8920] 发布于 2009-01-31 08:57:00
不一定要别名,当别名了函数名一样进,VB会自动去掉别名,你可以试试
新年快乐!
3 楼
ggyy66 [专家分:10] 发布于 2009-01-31 09:05:00
[quote]不一定要别名,当别名了函数名一样进,VB会自动去掉别名,你可以试试
新年快乐![/quote]
确实是这样,但是我试过,不加别名确实不行,结果不对呀。
可是从api浏览器中拷入后,VB6会自动去除别名,不知为什么?
4 楼
merry05 [专家分:8920] 发布于 2009-02-02 09:04:00
那只能说明函数的声明是错的,看下面这个小例子
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
我来回复