'指针
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)Private Type SendSM
    nErrorCode As Integer
End TypePrivate Type RecieveSM
    sMsgID As String
    nIsReport As Integer
    nMsgFormat As Integer
    sRecvTime As String
    sSrcrmID As String
    sDestTermID As String
    nMsgLen As Integer
    sMsgContent As String
End Type'接收
Public Sub Recieve(Server As String, UID As String, _
                        PWD As String, DataBase As String)
                        
    Dim DataBuf(315) As Byte
    Dim myMsg As RecieveSM
    ret = SMGPDeliver(0, VarPtr(DataBuf(0)))
    CopyMemory myMsg, DataBuf(0), LenB(myMsg)
    'MsgBox ret, vbApplicationModal
    
    If ret = 0 Then
        Set conn = CreateObject("ADODB.Connection")
        Dim str As String
        str = "DRIVER={SQL Server};server=" & Server & ";uid=" & UID & ";pwd=" & PWD & ";database=" & DataBase
        conn.Open str
    
        SQL = "insert into SMGPDeliver(sMsgID,nIsReport,nMsgFormat,sRecvTime,sSrcrmID," & _
            "sDestTermID,nMsgLen,sMsgContent) values('" & myMsg.sMsgID & "'," & _
            myMsg.nIsReport & "," & myMsg.nMsgFormat & ",'" & myMsg.sRecvTime & "','" & _
            myMsg.sSrcrmID & "','" & myMsg.sDestTermID & "'," & myMsg.nMsgLen & ",'" & _
            myMsg.sMsgContent & "')"
        conn.Execute SQL
        conn.Close
        Set conn = Nothing
    End If
    
End Sub

解决方案 »

  1.   

    Type RecieveSM 结构中有字符串成员,直觉上觉得可能会出现问题,VB的字符串好像是指针的指针而不是直接的指针,因此要从结构中获取字符串,可能需要把那些字符串成员的类型改为Long,然后用 CopyMemory去取真正的值。
    Private Type RecieveSM
        sMsgID As Long
        ……
    End Type    ret = SMGPDeliver(0, VarPtr(DataBuf(0)))
        CopyMemory myMsg, DataBuf(0), LenB(myMsg)
        msgIDSize = getStrsize (myMsg.sMsgID)
        CopyMemory byval str1, byval myMsg.sMsgID, msgSize