powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / И все-таки, как бороться со struct/union
1 сообщений из 1, страница 1 из 1
И все-таки, как бороться со struct/union
    #37913882
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче в исходниках,
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
struct OpalMessage {
  OpalMessageType m_type;   ///< Type of message
  union {
    const char *             m_commandError;       ///< Used by OpalIndCommandError
    OpalParamGeneral         m_general;            ///< Used by OpalCmdSetGeneralParameters
    OpalParamProtocol        m_protocol;           ///< Used by OpalCmdSetProtocolParameters
    OpalParamRegistration    m_registrationInfo;   ///< Used by OpalCmdRegistration
    OpalStatusRegistration   m_registrationStatus; ///< Used by OpalIndRegistration
    OpalParamSetUpCall       m_callSetUp;          ///< Used by OpalCmdSetUpCall/OpalIndProceeding/OpalIndAlerting/OpalIndEstablished
...
  } m_param;
};
===
  OpalMessage * OPAL_EXPORT OpalSendMessage(OpalHandle handle, const OpalMessage * message)
  {
    return handle == NULL ? NULL : handle->manager.SendMessage(message);
  }



На NET решают так:
Код: c#
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
    [StructLayout(LayoutKind.Explicit)]
    public struct OpalMessageUnion
    {
      //string
      [FieldOffset(0)]
      public IntPtr m_commandError;       ///< Used by OpalIndCommandError

      //string
      [FieldOffset(0)]
      public IntPtr m_callToken;          ///< Used by OpalCmdHoldcall/OpalCmdRetrieveCall/OpalCmdStopRecording
                                          ///
      [FieldOffset(0)]      
      public OpalParamGeneral m_general;            ///< Used by OpalCmdSetGeneralParameters

      [FieldOffset(0)]
      public OpalParamProtocol m_protocol;           ///< Used by OpalCmdSetProtocolParameters

      [FieldOffset(0)]
      public OpalParamRegistration m_registrationInfo;   ///< Used by OpalCmdRegistration

      [FieldOffset(0)]
      public OpalStatusRegistration m_registrationStatus; ///< Used by OpalIndRegistration

      [FieldOffset(0)]
      public OpalParamSetUpCall m_callSetUp;          ///< Used by OpalCmdSetUpCall/OpalIndProceeding/OpalIndAlerting/OpalIndEstablished     
...
    }

    [StructLayout(LayoutKind.Explicit)]
    public struct OpalMessage
    {
      /// type of message
      [FieldOffset(0)]
      public OpalMessageType m_type;

      [FieldOffset(4)]
      public OpalMessageUnion m_param;
    }
    [DllImport("OPAL.DLL", CallingConvention = CallingConvention.StdCall)]    
    public static extern IntPtr OpalSendMessage(IntPtr opal, ref OpalMessage message);



Konst_One,
я видимо с годами тупею, но я этого и сейчас не понимаю:
Как использовать API если есть исходные коды C++ но нет документации для VB

Короче я сделал так:
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
Public Type OpalMessageCommandError
  m_type As OpalMessageType 'type of message=OpalIndCommandError
  m_param As String
End Type

Public Type OpalMessageGeneral
  m_type As OpalMessageType 'type of message=OpalCmdSetGeneralParameters
  m_param As OpalParamGeneral
End Type

Public Type OpalMessageProtocol
  m_type As OpalMessageType 'type of message=OpalCmdSetProtocolParameters
  m_param As OpalParamProtocol
End Type

Public Type OpalMessageRegistration
  m_type As OpalMessageType 'type of message=OpalCmdRegistration
  m_param As OpalParamRegistration
End Type

Public Type OpalMessageStatusRegistration
  m_type As OpalMessageType 'type of message=OpalIndRegistration
  m_param As OpalStatusRegistration
End Type

Public Type OpalMessageSetUpCall
  m_type As OpalMessageType 'type of message=OpalCmdSetUpCall/OpalIndProceeding/OpalIndAlerting/OpalIndEstablished
  m_param As OpalParamSetUpCall
End Type
'===
Public Declare Function OpalSendMessage_SetGeneralParameters Lib "opal.dll" Alias "OpalSendMessage" _
  (ByVal opal As Long, ByRef Message As OpalMessageGeneral) As Long
Public Declare Function OpalSendMessage_SetProtocolParameters Lib "opal.dll" Alias "OpalSendMessage" _
  (ByVal opal As Long, ByRef Message As OpalMessageProtocol) As Long
Public Declare Function OpalSendMessage_Registration Lib "opal.dll" Alias "OpalSendMessage" _
  (ByVal opal As Long, ByRef Message As OpalMessageRegistration) As Long
Public Declare Function OpalSendMessage_SetUpCall Lib "opal.dll" Alias "OpalSendMessage" _
  (ByVal opal As Long, ByRef Message As OpalMessageSetUpCall) As Long



Сойдет ли?
Я пока не пытался анализировать ответы от OpalSendMessage.
Она возвращает Message As OpalMessage
Ну так понимаю указатель на Message.
вот только заранее неизвестен m_type As OpalMessageType
Как бороться?
CopyMemory наобум и анализ m_type, затем CopyMemory в разные структуры в завис. от вида m_type?
Счас пока думаю, можно ли расчленить union как я сделал.
Или есть лучший метод. Пока только экспериментирую с командами а анализ делаю по физическим результатам и логам Opal, а не программно из анализа ответа ф-ции.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / И все-таки, как бороться со struct/union
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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