Короче в исходниках,
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 решают так:
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
Короче я сделал так:
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, а не программно из анализа ответа ф-ции.