2010-10-13 76 views
0

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

long str_address = ... 
string str = ? 

请你对此有所了解吗?

+0

在VBA中,'long'是一个整数类型 - 请解释一下它是如何指向一个以null结尾的字符串的?请参阅[MSDN](http://msdn.microsoft.com/en-us/library/aa164754.aspx) – Oded 2010-10-13 08:21:46

+0

该整数的值实际上是一个以空字符结尾的字符串的地址 – 2010-10-13 08:38:16

+0

@Oded我正在使用IPC,并获取通过CreateFileMapping/MapViewOfFile的地址,它返回的地址长在VBA – 2010-10-13 08:40:20

回答

3

我用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 
3

如果由于某种原因,你结束了一个指向VBA的ANSII 0结尾的字符串,则需要将内容复制到一个字符串:

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))