C#COM客户端(RTD)

时间:2012-10-13 05:31:45

标签: c# com rtd

我正在使用一个实时数据服务器(一个交易终端),它有一个用于更新股票代码的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接口,但是我无法让它工作。

1 个答案:

答案 0 :(得分:0)

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

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

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