【发布时间】: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 代码吗?