为了获取字符串的指针,而非保存字符串的变量的指针,只须在变量名前加上ByVal即可。如:Debug.Print VarPtr(s),VarPtr(ByVal s) '例1
在VB3之前,用这种方法来获取字符串缓冲的指针是非常普遍的。但是由于VB6的UNICODE和ANSI字符串的自动变化机制,和当一个字符串传递给VarPtr函数时,函数执行后所返回的地址是保存临时ANSI字符串的临时ANSI字符串或变量的地址。换句话说,这个地址并不是你声明的变量的真正地址。因此,对于字符串变量以及包括字符串的结构来讲,例1后半段这种用法完全失效了。
可是我像下面这样测试了几次,后两个数字都是一样的:
    Debug.Print VarPtr(s), StrPtr(s), VarPtr(ByVal s)

解决方案 »

  1.   

    以前的 VarPtr 必须通过 Declare 语句声明,所以有 Unicode-Ansi 自动转换。
    而到了 VB6,ObjPtr/StrPtr/VarPtr 作为隐藏的内部函数直接提供,就不需要 Unicode-Ansi 自动转换。
    看下面内部函数和 Declare 声明函数的比较
    Option ExplicitDeclare Function MyVarPtr Lib "msvbvm60" Alias "VarPtr" (Var As Any) As LongSub Main()
        Dim s As String
        
        s = "abc"
        
        Debug.Print Hex(StrPtr(s))
        Debug.Print Hex(VarPtr(s)), Hex(MyVarPtr(s))
        Debug.Print Hex(VarPtr(ByVal s)), Hex(MyVarPtr(ByVal s))
    End Sub
    '==输出==
    'C8B1FBC
    '13FBD0        13FB9C
    'C8B1FBC       F9D87CC