2012-10-13 139 views
0

我正在使用一個實時數據服務器(交易終端),它具有用於股票更新的COM接口。 從Excel中,我可以訂閱使用這個股票的更新 -C#COM客戶端(RTD)

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

我試圖建立將接收這些股票更新,而無需在Excel或任何依賴它的任何API的應用。我是一位在MS技術方面沒有經驗的Java開發人員,但我認爲我會在C#中給出這一點。

我使用OLEVIEW挖了這個類型庫

// 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接口,但我無法讓它工作。

+0

嗨維韋克,我也想這樣做,你正在嘗試類似的東西,你可以請讓我知道你是從哪裏得到TypeLib代碼? – jwilson

回答

0

關於使用TlbImp.exe有什麼不明白的地方?看起來很容易:使用它將COM類型庫轉換爲.NET程序集,從C#項目中添加對該程序集的引用,然後像使用其他.NET程序集一樣使用它。

而實際上,根本不需要使用TlbImp.exe,只需添加對所提及的MSDN文章中提到的類型庫的引用即可。

總之,這裏的另一篇文章,解釋導入類型庫的詳細信息:http://msdn.microsoft.com/en-us/library/xwzy44e4.aspx