我正在使用一个实时数据服务器(一个交易终端),它有一个用于更新代码的 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();
};
我遇到了这个例子,但是关于使用 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。
我看过这个例子,它似乎使用反射而不是声明 COM 接口,但我无法让它工作。