如何转换要在VBA中使用的代码System.Runtime.InteropServices.Marshal.Copy()?

时间:2013-07-31 03:53:48

标签: vba

我正在开发一个VBA程序,我在VB.NET中有以下代码:

    Private Function SYS_GuidPtrToGuid(ByVal p As System.IntPtr) As System.Guid
        Dim b(15) As Byte
        Dim myGuid As System.Guid
        System.Runtime.InteropServices.Marshal.Copy(p, b, 0, b.Length)
        myGuid = New System.Guid(b)
        Erase b
        Return myGuid
    End Function

我是否需要重写代码或是否还有其他可以使用的功能?谢谢。

1 个答案:

答案 0 :(得分:0)

您需要首先确定哪些Guid类可用,以及它们是否提供了从指针接收GUID的方法,但是可以使用Byte数组,例如。 NET Guid,然后您需要使用

Marshal.Copy来电转换为MemCpy来电
Declare Sub MemCpy Lib "kernel32.dll" Alias "RtlMoveMemory" (ByVal Destination() As Byte, ByVal SourcePtr As Long, ByVal Length As Long)

注意我已调整MemCpy声明以期望指针已转换为Long并复制到Byte数组。

所以,您的代码可能是(但请记住我还没有检查过哪些Guid类可用):

Private Function SYS_GuidPtrToGuid(ByVal p As Long) As Guid
    Dim b(15) As Byte
    MemCpy b, p, UBound(b) - LBound(b) + 1
    SYS_GuidPtrToGuid = New Guid(b)
End Function

根据您的评论,这是一个MemCpy声明,可以从Long指针直接复制到guid

Declare Sub MemCpy Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As GUID, ByVal SourcePtr As Long, ByVal Length As Long)

现在电话很简单:

Private Function SYS_GuidPtrToGuid(ByVal p As Long) As Guid
    MemCpy SYS_GuidPtrToGuid, p, 16
End Function

这取决于guid包装是否正确,但这是Type的重点。