Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameW" (ByVal lpBuffer As String, nSize As Long) As Long
Private Sub Command2_Click()
   Dim str As String * 255
   GetComputerName str, 255
   StrConv str, vbFromUnicode
   能正确显示End Sub

解决方案 »

  1.   

    如果  Declare 时,要想用W版的API函数,那么“字符串参数”都不能用String类型了,只能传“指针”。
    比如这样用,就可以“正确获取数据”:
    Option ExplicitPrivate Declare Function GetComputerName Lib "kernel32" _
                      Alias "GetComputerNameW" ( _
                               ByVal lpBuffer As Long, _
                               ByRef nSize As Long) As LongPrivate Sub Command1_Click()
       Dim strTemp As String
       Dim w As Long
       
       w = 255&       ' 缓冲区长度
       strTemp = String$(w, vbNullChar)
       Call GetComputerName(StrPtr(strTemp), w)
       Me.Caption = Left$(strTemp, w)
    End Sub
      

  2.   

    凡是调用通过Declare声明的API函数,所有的String参数在调用、返回时,它都要“隐含的进行编码转换”。因此,你主贴中的代码,本来API函数已经在“字符数据缓冲区”放入的Unicode编码的字符串了;
      但在“函数返回”后,VB6把它当成ANSI格式编码又“悄悄的”再给你“转换成Unicode编码”,
    所以你必须又要“从Unicode编码转换回来”才能正确显示。结果:本来“根本不需要进行字符串编码转换”的,在你的代码中却偏偏进行了3次转换…………