ColdLinkのサンプルの稼働を確認しました。
Dictionary操作の部分がそのままでは動かなかったので修正を入れています。
Module Module1
Sub Main()
Console.WindowWidth = 135
Dim Client As DdeClient
Client = New NDde.Client.DdeClient("RSS", "8411.T")
Client.Context.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
Client.Connect()
'Itemとその値を格納する
Dim itemMap As New Dictionary(Of String, String)
itemMap.Add("現在値", "")
itemMap.Add("現在値時刻", "")
itemMap.Add("出来高", "")
itemMap.Add("最良売気配値1", "")
itemMap.Add("最良買気配値1", "")
'値を変更したDictionaryのKeyをForEachのInで参照するとエラーとなるので、
'DictionaryのKeyのリストを作成し、これをInで参照してForEachする。
Dim keyList As New List(Of String)(itemMap.Keys)
For Each itemKey As String In keyList
Try
'value = Client.Request(itemKey, 1000)
itemMap(itemKey) = Client.Request(itemKey, 1000)
Console.WriteLine(itemKey + " : " + itemMap(itemKey))
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
Next
Console.Read()
Client.Disconnect()
End Sub
End Module
最初の実行時に例外を受け取ってCatchの方に入る場合がありますが、もう一度実行するとデータを受け取ることができています。まだ原因は不明です。連続的に実行すると途中でも発生するのかもしれません。
Console.read()は、確認メッセージ出力を見る為に入れています。Returnキー押下で終了します。
HotLinkの方も確認しましたので、載せておきます。
Module Module1
Dim itemMap As Dictionary(Of String, String)
Sub Main()
Console.WindowWidth = 135
Dim Client = New NDde.Client.DdeClient("RSS", "8411.T")
Client.Context.Encoding = System.Text.Encoding.GetEncoding("Shift_JIS")
Client.Connect()
' Itemとその値を格納する
itemMap = New Dictionary(Of String, String)
itemMap.Add("現在値", "")
itemMap.Add("現在値時刻", "")
itemMap.Add("出来高", "")
itemMap.Add("最良売気配値1", "")
itemMap.Add("最良買気配値1", "")
AddHandler Client.Advise, AddressOf ChangeValue
For Each itemName As String In itemMap.Keys
Client.StartAdvise(itemName, 1, True, False, 1000, Nothing)
Next
Console.Read()
For Each itemName As String In itemMap.Keys
Client.StopAdvise(itemName, 1000)
Next
RemoveHandler Client.Advise, AddressOf ChangeValue
Client.Disconnect()
End Sub
Sub ChangeValue(ByVal sender As Object, ByVal e As NDde.Client.DdeAdviseEventArgs)
Try
Dim Client As NDde.Client.DdeClient = DirectCast(sender, NDde.Client.DdeClient)
Dim topicName As String = Client.Topic
'Console.WriteLine("topicName: " + topicName)
If itemMap.ContainsKey(e.Item) Then
itemMap(e.Item) = e.Text
Console.WriteLine(e.Item + " : " + itemMap(e.Item))
End If
Catch ex As Exception
Console.WriteLine("例外が発生しました。" + vbCrLf + ex.Message)
End Try
End Sub
End Module
DictionaryのitemMapは二つの関数から参照するので、Moduleレベルの変数としました。
ForEachのInで参照するメンバーをKeysに変更しています。
この場合のConsole.read()はメッセージ出力確認だけでなく、非同期に呼び出されるChangeValue()の実行の前にMain()が終了してはいけないだろう思い、入れています。実際の運用でこの辺りをどうするのか、アイデアを頂ければ幸いです。
ザラ場での実行確認はまだですが、一回だけデータを受け取るところまでは確認しています。
実運用までにはまだ確認項目、対処項目がありそうです。今後ともよろしくお願い申します。
- karankoron
- 2013/04/14 (Sun) 18:46:53