powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как прочесть строку char *, указатель the_IntPtr на которую в памяти известен
6 сообщений из 6, страница 1 из 1
Как прочесть строку char *, указатель the_IntPtr на которую в памяти известен
    #37915269
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо по сути сделать на VB6 вот это
Код: vbnet
1.
str= Runtime.InteropServices.Marshal.PtrToStringAnsi(the_IntPtr)


Пытаюсь так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
  'p -указатель на начало (the_IntPtr as long)
    Dim ErrStr As String
    Dim LL As Long
    LL = lstrlenW(p)
    If LL > 0 Then
        ErrStr = Space$(LL)
        CopyMemory ByVal StrPtr(ErrStr), ByVal p, LL * 2
    End If
    MsgBox "Error: " & ErrStr


Выдает иероглифы

По сути думаю что ErrStr -это массив байтов, и мне надо эти байты копировать до нулевого, а потом каждому байту делать chr()
Нет примера правильного кода?
...
Рейтинг: 0 / 0
Как прочесть строку char *, указатель the_IntPtr на которую в памяти известен
    #37915292
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так вроде работает. Сойдет?
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Function PtrToString(ptr As Long) As String
    Dim data(255) As Byte
    Dim str As String
    Dim i As Integer
    str = ""
    CopyMemory data(0), ByVal ptr, 255
    For i = 0 To 255
        If data(i) = 0 Then Exit For
        str = str & Chr(data(i))
    Next i
    PtrToString = str
End Function
...
Рейтинг: 0 / 0
Как прочесть строку char *, указатель the_IntPtr на которую в памяти известен
    #37915321
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправочку надо внести:
Бывает что
const char * m_alertingType;
For other indications this field is NULL. */
Тогда ptr=0 и CopyMemory рухнет.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Function PtrToString(ptr As Long) As String
    Dim data(255) As Byte
    Dim str As String
    Dim i As Integer
    str = ""
    If ptr <> 0 Then
        CopyMemory data(0), ByVal ptr, 255
        For i = 0 To 255
            If data(i) = 0 Then Exit For
            str = str & Chr(data(i))
        Next i
    End If
    PtrToString = str
End Function
...
Рейтинг: 0 / 0
Как прочесть строку char *, указатель the_IntPtr на которую в памяти известен
    #37915351
катастрофа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77, где сие:

>Надо по сути сделать на VB6 вот это
>str= Runtime.InteropServices.Marshal.PtrToStringAnsi(the_IntPtr)

например Вы применяете?
...
Рейтинг: 0 / 0
Как прочесть строку char *, указатель the_IntPtr на которую в памяти известен
    #37915355
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
катастрофа, где сие:
например Вы применяете?

API-ф-ция возвращает указатель на структруру,
структура содержит указатели на String
Надо получить String:
Я применяю к Opal API.

VB6
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Private Sub CommandSetupCall_Click()
    Dim NewMes As OpalMessageSetUpCall
    Dim BackMesPtr As Long
    Dim MesType As OpalMessageType
    NewMes.m_type = OpalCmdSetUpCall
    NewMes.m_param.m_partyB = VarPtr(StringToMas("sip:100@192.168.1.3").ByteStr(0))
    NewMes.m_param.m_callToken = VarPtr(StringToMas("").ByteStr(0))
    BackMesPtr = OpalSendMessage_SetUpCall(L, NewMes)
    MsgBox BackMesPtr
    If BackMesPtr = 0 Then Exit Sub
    CopyMemory MesType, ByVal BackMesPtr, 4
    If MesType = OpalIndCommandError Then
        Dim p As Long
        CopyMemory p, ByVal BackMesPtr + 4, 4
        MsgBox "Error: " & PtrToString(p)
    ElseIf MesType = OpalCmdSetUpCall Then
        Dim s_SetUpCall As OpalParamSetUpCall
        CopyMemory ByVal VarPtr(s_SetUpCall), ByVal BackMesPtr + 4, LenB(s_SetUpCall)
        MsgBox "m_partyA: " & PtrToString(s_SetUpCall.m_partyA) & vbCrLf & _
          "m_partyB: " & PtrToString(s_SetUpCall.m_partyB) & vbCrLf & _
          "m_callToken: " & PtrToString(s_SetUpCall.m_callToken) & vbCrLf & _
          "m_alertingType: " & PtrToString(s_SetUpCall.m_alertingType) & vbCrLf & _
          "m_protocolCallId: " & PtrToString(s_SetUpCall.m_protocolCallId)
    End If
End Sub



VB.NET
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
    Private Sub CommandSetupCall_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CommandSetupCall.Click
        Dim NewMes As OpalDotNET.Opal_API.OpalMessage
        Dim ptrMessage As IntPtr
        Dim BackMes As OpalDotNET.Opal_API.OpalMessage
        NewMes.m_type = OpalDotNET.Opal_API.OpalMessageType.OpalCmdSetUpCall
        NewMes.m_param.m_callSetUp.m_partyB = Runtime.InteropServices.Marshal.StringToCoTaskMemAnsi("sip:100@192.168.1.3")
        NewMes.m_param.m_callSetUp.m_callToken = Runtime.InteropServices.Marshal.StringToCoTaskMemAnsi(vbNullString)
        ptrMessage = OpalDotNET.Opal_API.OpalSendMessage(L, NewMes)
        If (ptrMessage = IntPtr.Zero) Then
            MsgBox("Invalid message")
        Else
            BackMes = CType(Runtime.InteropServices.Marshal.PtrToStructure(ptrMessage, GetType(OpalDotNET.Opal_API.OpalMessage)), OpalDotNET.Opal_API.OpalMessage)
            If (BackMes.m_type = OpalDotNET.Opal_API.OpalMessageType.OpalIndCommandError) Then
                MsgBox("Error: " & Runtime.InteropServices.Marshal.PtrToStringAnsi(BackMes.m_param.m_commandError))
            ElseIf (BackMes.m_type = OpalDotNET.Opal_API.OpalMessageType.OpalCmdSetUpCall) Then
                MsgBox("m_partyA: " & Runtime.InteropServices.Marshal.PtrToStringAnsi(BackMes.m_param.m_callSetUp.m_partyA) & vbCrLf & _
                  "m_partyB: " & Runtime.InteropServices.Marshal.PtrToStringAnsi(BackMes.m_param.m_callSetUp.m_partyB) & vbCrLf & _
                  "m_callToken: " & Runtime.InteropServices.Marshal.PtrToStringAnsi(BackMes.m_param.m_callSetUp.m_callToken) & vbCrLf & _
                  "m_alertingType: " & Runtime.InteropServices.Marshal.PtrToStringAnsi(BackMes.m_param.m_callSetUp.m_alertingType) & vbCrLf & _
                  "m_protocolCallId: " & Runtime.InteropServices.Marshal.PtrToStringAnsi(BackMes.m_param.m_callSetUp.m_protocolCallId))
            End If
        End If
    End Sub
...
Рейтинг: 0 / 0
Как прочесть строку char *, указатель the_IntPtr на которую в памяти известен
    #37918377
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно все-таки так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Function PtrToString(ptr As Long) As String
    Dim data As Byte
    Dim str As String
    Dim i As Integer
    str = ""
    If ptr <> 0 Then
        For i = 0 To 255
            CopyMemory data, ByVal ptr + i, 1
            If data = 0 Then Exit For
            str = str & Chr(data)
        Next i
    End If
    PtrToString = str
End Function


Предыдущий вариант сразу копирует 256 байт,
если длина меньше и после '\0' возникает случайная проблема чтения памяти, то CopyMemory вылетит случайным образом (наблюдал это иногда). С последним вариантом из за этого не вылетает.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как прочесть строку char *, указатель the_IntPtr на которую в памяти известен
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]