Last active
January 17, 2024 15:42
-
-
Save bsommardahl/8605208 to your computer and use it in GitHub Desktop.
RTD Client in C#
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public interface IRtdClient | |
{ | |
object GetValue(params object[] args); | |
} | |
public class RtdClient : IRtdClient | |
{ | |
readonly string _rtdProgId; | |
static IRtdServer _rtdServer; | |
public RtdClient(string rtdProgId) | |
{ | |
_rtdProgId = rtdProgId; | |
} | |
public object GetValue(params object[] args) | |
{ | |
const int topicCount = 1; | |
var rnd = new Random(); | |
var topicId = rnd.Next(int.MaxValue); | |
var rtdServer = GetRtdServer(); | |
rtdServer.ConnectData(topicId, args, true); | |
object val = null; | |
while (val == null) | |
{ | |
var alive = rtdServer.Heartbeat(); | |
if (alive != 1) | |
GetRtdServer(); | |
else | |
{ | |
var refresh = rtdServer.RefreshData(topicCount); | |
if (refresh.Length <= 0) continue; | |
if (refresh[0, 0].ToString() == topicId.ToString()) | |
{ | |
val = refresh[1, 0]; | |
} | |
} | |
} | |
rtdServer.DisconnectData(topicId); | |
return val; | |
} | |
IRtdServer GetRtdServer() | |
{ | |
if(_rtdServer==null) | |
{ | |
Type rtd = Type.GetTypeFromProgID(_rtdProgId); | |
_rtdServer = (IRtdServer)Activator.CreateInstance(rtd); | |
} | |
return _rtdServer; | |
} | |
} | |
[ComImport, | |
TypeLibType((short)0x1040), | |
Guid("EC0E6191-DB51-11D3-8F3E-00C04F3651B8")] | |
public interface IRtdServer | |
{ | |
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(10)] | |
int ServerStart([In, MarshalAs(UnmanagedType.Interface)] IRTDUpdateEvent callback); | |
[return: MarshalAs(UnmanagedType.Struct)] | |
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(11)] | |
object ConnectData([In] int topicId, [In, MarshalAs(UnmanagedType.SafeArray, | |
SafeArraySubType = VarEnum.VT_VARIANT)] ref object[] parameters, [In, Out] ref bool newValue); | |
[return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] | |
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(12)] | |
object[,] RefreshData([In, Out] ref int topicCount); | |
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(13)] | |
void DisconnectData([In] int topicId); | |
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(14)] | |
int Heartbeat(); | |
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(15)] | |
void ServerTerminate(); | |
} | |
[ComImport, | |
TypeLibType((short) 0x1040), | |
Guid("A43788C1-D91B-11D3-8F39-00C04F3651B8")] | |
public interface IRTDUpdateEvent | |
{ | |
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(10), | |
PreserveSig] | |
void UpdateNotify(); | |
[DispId(11)] | |
int HeartbeatInterval { [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(11)] | |
get; [param: In] | |
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(11)] | |
set; } | |
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId(12)] | |
void Disconnect(); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@julianozucatti I can give my dirty sandbox application
where I tried to make RTD Client for "TWS RTD Server API".
What is good here, you can see the sources of this API and what is going
with your requests.
Google Drive