Vb.net 如何在VB中从长字符串指定的地址获取字符串

Vb.net 如何在VB中从长字符串指定的地址获取字符串,vb.net,vba,vb6,vbscript,Vb.net,Vba,Vb6,Vbscript,在vba中,有一个长类型持有的地址指向以null结尾的字符串,但我找不到从该地址获取字符串的方法: long str_address = ... string str = ? 请说明一下这一点好吗?如果出于某种原因,您在VBA中得到了指向ANSII零终止字符串的指针,则需要将内容复制到字符串: Private Declare Function SysAllocStringByteLen Lib "oleaut32.dll" (ByVal m_pBase As Long, ByVal l As

在vba中,有一个长类型持有的地址指向以null结尾的字符串,但我找不到从该地址获取字符串的方法:

long str_address = ...
string str = ?

请说明一下这一点好吗?

如果出于某种原因,您在VBA中得到了指向ANSII零终止字符串的指针,则需要将内容复制到字符串:

Private Declare Function SysAllocStringByteLen Lib "oleaut32.dll" (ByVal m_pBase As Long, ByVal l As Long) As String
Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Long) As Long

...
dim s as string    
s = SysAllocStringByteLen(str_address, lstrlen(str_address))

如果由于某种原因,在VBA中出现了指向ANSII零终止字符串的指针,则需要将内容复制到字符串:

Private Declare Function SysAllocStringByteLen Lib "oleaut32.dll" (ByVal m_pBase As Long, ByVal l As Long) As String
Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Long) As Long

...
dim s as string    
s = SysAllocStringByteLen(str_address, lstrlen(str_address))

我这样使用
CopyMemory

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function lstrlenA Lib "kernel32" (ByVal lpString As Long) As Long

Private Function pvToString(ByVal lPtr As Long) As String
    If lPtr <> 0 Then
        pvToString = String(lstrlenA(lPtr), 0)
        Call CopyMemory(ByVal pvToString, ByVal lPtr, Len(pvToString))
    End If
End Function
Private声明子CopyMemory Lib“kernel32”别名“rtlmovemory”(目标为任意,源为任意,ByVal长度为任意)
私有声明函数lstrlenA Lib“kernel32”(ByVal lpString As Long)为Long
私有函数pvToString(ByVal lPtr As Long)作为字符串
如果lPtr为0,则
pvToString=字符串(lstrlenA(lPtr),0)
调用CopyMemory(ByVal pvToString、ByVal lPtr、Len(pvToString))
如果结束
端函数

我使用
CopyMemory
的方式如下:

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function lstrlenA Lib "kernel32" (ByVal lpString As Long) As Long

Private Function pvToString(ByVal lPtr As Long) As String
    If lPtr <> 0 Then
        pvToString = String(lstrlenA(lPtr), 0)
        Call CopyMemory(ByVal pvToString, ByVal lPtr, Len(pvToString))
    End If
End Function
Private声明子CopyMemory Lib“kernel32”别名“rtlmovemory”(目标为任意,源为任意,ByVal长度为任意)
私有声明函数lstrlenA Lib“kernel32”(ByVal lpString As Long)为Long
私有函数pvToString(ByVal lPtr As Long)作为字符串
如果lPtr为0,则
pvToString=字符串(lstrlenA(lPtr),0)
调用CopyMemory(ByVal pvToString、ByVal lPtr、Len(pvToString))
如果结束
端函数

在VBA中,
long
是一种整数类型-请首先解释它如何指向以null结尾的字符串?请看整数的值实际上是以null结尾的地址string@Oded我正在使用IPC,并通过CreateFileMapping/MapViewOfFile获取地址,该文件返回的地址在VBAIn VBA中为long,
long
为整数类型-请首先解释它如何指向以null结尾的字符串?请看整数的值实际上是以null结尾的地址string@Oded我正在使用IPC,并通过CreateFileMapping/MapViewOfFile获取地址,该文件返回的地址在VBA中的长度相同