0

ティッカー更新用のCOMインターフェイスを備えたリアルタイムデータサーバー(取引端末)を使用しています。Excelから、これを使用してティッカー更新をサブスクライブできます-

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

ExcelまたはそのAPIに依存せずに、これらのティッカー更新を受信するアプリケーションを構築しようとしています。私はMSテクノロジの経験がないJava開発者ですが、これをC#で試してみようと思いました。

このTypeLibを掘り下げるために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();
};

この例に出くわしましたが、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 
}

これはコールバックを登録しませんが、これをタイマーで実行すると、個々のシンボルのティッカー更新を取得できます。

違いが生じる場合は、Win7x64を使用しています。

COMインターフェイスを宣言する代わりにリフレクションを使用しているように見えるこの例を見てきましたが、動作させることができませんでした。

4

1 に答える 1

0

TlbImp.exe の使用について不明な点は何ですか? COM タイプ ライブラリを .NET アセンブリに変換し、C# プロジェクトからそのアセンブリへの参照を追加してから、他の .NET アセンブリと同じように使用します。

実際には、TlbImp.exe を使用する必要はまったくありません。言及した MSDN の記事に記載されているように、タイプ ライブラリへの参照を追加するだけです。

とにかく、タイプ ライブラリのインポートについて詳しく説明している別の記事があります: http://msdn.microsoft.com/en-us/library/xwzy44e4.aspx

于 2012-10-13T07:53:12.230 に答える