【问题标题】:C# COM client (RTD)C# COM 客户端 (RTD)
【发布时间】:2017-03-29 00:19:15
【问题描述】:

我正在使用一个实时数据服务器(一个交易终端),它有一个用于更新代码的 COM 接口。 在 Excel 中,我可以使用它订阅代码更新 -

RTD(progId,,topic1,topic2, ...)

我正在尝试构建一个应用程序,该应用程序将接收这些代码更新,而不依赖于 Excel 或其任何 API。我是一名没有 MS 技术经验的 Java 开发人员,但我想我会在 C# 中尝试一下。

我用 OleView 挖掘了这个 TypeLib

// TLib :     // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
importlib("stdole2.tlb");

// Forward declare all types defined in this typelib
interface IScripRTD;
interface IRTDUpdateEvent;

[
  uuid(A04A3240-D051-4B4C-B004-CA92151F11E5),
  helpstring("ScripRTD Class")
]
coclass ScripRTD {
    [default] interface IScripRTD;
};

[
  odl,
  uuid(EC0E6191-DB51-11D3-8F3E-00C04F3651B8),
  helpstring("IScripRTD Interface"),
  dual,
  nonextensible,
  oleautomation
]
interface IScripRTD : IDispatch {
    [id(0x0000000a)]
    HRESULT ServerStart(
                    [in] IRTDUpdateEvent* callback, 
                    [out, retval] long* result);
    [id(0x0000000b)]
    HRESULT ConnectData(
                    [in] long topicId, 
                    [in] SAFEARRAY(VARIANT)* strings, 
                    [in, out] VARIANT_BOOL* newValues, 
                    [out, retval] VARIANT* values);
    [id(0x0000000c)]
    HRESULT RefreshData(
                    [in, out] long* topicCount, 
                    [out, retval] SAFEARRAY(VARIANT)* data);
    [id(0x0000000d)]
    HRESULT DisconnectData([in] long topicId);
    [id(0x0000000e)]
    HRESULT Heartbeat([out, retval] long* result);
    [id(0x0000000f)]
    HRESULT ServerTerminate();
};

[
  odl,
  uuid(A43788C1-D91B-11D3-8F39-00C04F3651B8),
  dual,
  oleautomation
]
interface IRTDUpdateEvent : IDispatch {
    [id(0x0000000a)]
    HRESULT UpdateNotify();
    [id(0x0000000b), propget]
    HRESULT HeartbeatInterval([out, retval] long* value);
    [id(0x0000000b), propput]
    HRESULT HeartbeatInterval([in] long value);
    [id(0x0000000c)]
    HRESULT Disconnect();
};

我遇到了这个example,但我不清楚关于使用 TlbImp 自动生成 C# 接口的部分。谁能提供一个更好的例子来说明如何实例化这个接口并注册一个回调来获取代码更新?

顺便说一句,我能够快速编写一个接近我正在寻找的 AHK 脚本 -

get_price(symbol)
{
    comObj := ComObjCreate(progId)
    num := ComObjParameter(3, 5)
    update := ComObjParameter(0xB, -1)
    arr := ComObjArray(VT_VARIANT:=12, 3)
    arr[0] := "MktWatch"
    arr[1] := symbol
    arr[2] := "Last Traded Price"
    price := comObj.ConnectData(num, arr, update )
    return price 
}

这不会注册回调,但如果我使用计时器运行它,我可以获得单个符号的代码更新。

以防万一,我使用的是 Win 7 x64。

我看过这个example,它似乎使用反射而不是声明COM接口,但我无法让它工作。

【问题讨论】:

  • 您好 Vivek,我也在尝试做与您尝试类似的事情,您能告诉我您从哪里获得 TypeLib 代码吗?

标签: c# com rtd


【解决方案1】:

使用 TlbImp.exe 有什么不清楚的地方?对我来说似乎很容易:使用它将 COM 类型库转换为 .NET 程序集,从 C# 项目中添加对该程序集的引用,然后像使用任何其他 .NET 程序集一样使用它。

实际上,您根本不需要使用 TlbImp.exe,只需添加对您提到的 MSDN 文章中提到的类型库的引用即可。

无论如何,这里还有一篇文章更详细地解释了导入类型库:http://msdn.microsoft.com/en-us/library/xwzy44e4.aspx

【讨论】:

    猜你喜欢
    • 2021-03-04
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    相关资源
    最近更新 更多