【问题标题】:RTD Client in C#C# 中的 RTD 客户端
【发布时间】:2021-03-04 22:32:02
【问题描述】:

我正在尝试编写一个简单的 RTD 客户端来开始一些事情,但我似乎无法建立初始连接。我在网上找到了一些例子,最好的似乎是this RTD client in C# gist

在 MS-Excel 上有这个:=RTD("rtdtrading.rtdserver",, "WINZ20_F_0", "HOR") - 公式适用于 Excel 并提取新数据。

在上述要点的代码中,然后我尝试使用以下方法实例化对象:

var handler = new RtdClient("rtdtrading.rtdserver");

到目前为止,一切都很好。但是,当我尝试

var valList = handler.GetValue(new object[] { "WINZ20_G_0", "HOR" });

我收到了来自IRtdServer.ConnectData(Int32 topicId, Object[]& parameters, Boolean& newValue)line 24 in the code above 的重大灾难性故障 (0x8000FFFF (E_UNEXPECTED))

如果我尝试使用new string[] { "WINZ20_G_0", "HOR" });,那么错误更改为Specified array is not of the expected type,发生的更深一些,但我相信在ConnectData()实际运行之前,正如调用堆栈所建议的那样:

at System.StubHelpers.MngdSafeArrayMarshaler.ConvertSpaceToNative(IntPtr pMarshalState, Object& pManagedHome, IntPtr pNativeHome)
at ProfitRTDAnalyzer.Program.IRtdServer.ConnectData(Int32 topicId, Object[]& parameters, Boolean& newValue)

我似乎无法正确确定如何处理此问题。将object[] 引用更改为string[],它们与这些参数相关(主题列表),也没有帮助(仍然 _array 不是预期的类型)。

根据MS documentation, ConnectData() receives as second parameter a single-dimensional array of strings,所以不知道这里出了什么问题。

【问题讨论】:

    标签: excel interop rtd


    【解决方案1】:

    为了解决这个问题,我已经这样做了:

    1. 创建一个新类来实现UpdateEvent:
        public class UpdateEvent : IRTDUpdateEvent
        {
            public long Count { get; set; }
            public int HeartbeatInterval { get; set; }
    
            public UpdateEvent()
            {
                // Do not call the RTD Heartbeat()
                // method.
                HeartbeatInterval = -1;
            }
    
            public void Disconnect()
            {
                // Do nothing.
            }
    
            public void UpdateNotify()
            {
                Count++;
            }
        }
    
    1. 然后,将其替换为 GetRtdServer 函数
            IRtdServer GetRtdServer() {
                if (_rtdServer == null) {
                    Type rtd = Type.GetTypeFromProgID(_rtdProgId);
                    _rtdServer = (IRtdServer) Activator.CreateInstance(rtd);
    
                    // Create the updateEvent.
                    UpdateEvent updateEvent = new UpdateEvent();
                    _rtdServer.ServerStart(updateEvent);
    
                }
                return _rtdServer;
            }
    

    【讨论】:

    • 我并没有真正尝试过您的回答,我的 Office 注册已经消失,我不确定我试图将其用于什么......但是您的回答看起来与要点中的另一个一致(基本上用UpdateEvent对象的实例/存根调用.ServerStart()。给予或接受,你的方向,如果没有解决它,是有道理的,应该帮助其他面临同样问题的人。
    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 2022-07-10
    • 1970-01-01
    • 2017-03-31
    相关资源
    最近更新 更多