copymemory ByVal StrPtr(b$),ByVal StrPtr(a$),4

解决方案 »

  1.   

    应该不会是VB中加了Lenb(a)的,你把参数三改为2,就会出现“非法操作”(98下),具体的我也不太清楚(对CopyMemory不是很熟悉),你去问问Acptvb吧!
      

  2.   

    原因:String变量的地址并不是字符串的地址
      

  3.   

    byval不用写吧.因为我的宣告
    Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
    (Destination As Any, Source As Any, ByVal Length As Long)
    也是byval啊.string不是字符串的地址是不是说上面a$的地址200700?acptvb又是谁啊,我不知道啊.怎么找?
      

  4.   

    String变量的地址并不是字符串的地址 ?
    -------  那是 谁的地址?
      

  5.   

    补充:VB字符串严格来讲称作BSTR,实际上是一个指针,它存放的内容是指向字符数组开始的地址,用Varptr得到的是这个指针的地址,用Strptr得到的才是这个指针的内容,即字符数组的地址。
    另外,字符数组前面还有两个字节用来存放字符串的长度。
    实际上VB的字符串非常的复杂,特别是当它和API函数交互作用的时候。建议最好找本书来看。
      

  6.   

    呀, 晕 ...... ^-^大家还是先分清什么是 字符串,什么是 字符串数组 .什么情况下才有 SAFYARRAY 结构 .
      

  7.   

    又打错了. 是 SAFEARRAY 结构.
      

  8.   

    To: sonicdater(告别CSDN,开门练功中……) 
    大家还是先分清什么是 字符串,什么是 字符串数组 .'我说的不是字符串数组,而是字符数组,在VB中,实际上是由指针和字符数组构成了字符串。
      

  9.   

    hillmanweb(山人) 
    讲的是对的,就是VB中的字符串是一个BSTR结构的,它是一个指针,指向一个包含实际字符串内容以及长度的内存。
    在上面你的代码中,实际上还是指针的拷贝,并没有赋值整个字符串,至于为什么出现
    a$="no good"
    后仍然b$得到正确的结果,是因为VB会重新为a$分配内存地址,参考下面的代码:    Dim a$
        
        a$ = "abcd"
        Debug.Print StrPtr(a$)
        a$ = "abcd"
        Debug.Print StrPtr(a$)可以发现每次得到的结果不一样,这就是因为VB自动为新的字符串赋值而给a$分配了新的内存空间。
    那么在上面的问题中,CopyMemory是将a$的地址赋予b$,然后重新给a$赋值后b$仍然指向原来a$指向的内存空间,所以可以得到a$原来的结果。
      

  10.   

    由于VB隐藏了很多细节,所以只能给你一些我的大概理解,现在正在翻一本很久以前买的 Visual Basic 5.0 核心技术,希望能找到更准确的答案。
      

  11.   

    string应该是一个类似CString *的东西吧。
      

  12.   

    TechnoFantasy(www.applevb.com) 
    我想你是对的,谢了。