FC2ブログ
現役プログラマー村健の、投資に役立つプログラムを作るための勉強ブログです。 自動売買、システムトレードに挑戦!します。 勉強と習得の成果を記録です。
本ブログについて
本ブログは、プログラマー観点で投資への対費用効果を上げるために何ができるか?を考えていくブログです。
基本的には、ツール作成・公開、投資に関わるプログラム情報、最終的には 完全なる自動売買を目指しています。

現在、HPの方で現在作成中のツールや発注ロジックなどを公開中です。
IEを操作するアプリケーションを作成する時は、MSHTMLを参照設定してプログラムします。
そして作成した実行ファイルを配布しますが、PC環境によっては以下の例外が発生して、動作しない場合があります。

System.IO.FileNotFoundException: ファイルまたはアセンブリ 'Microsoft.mshtml, Version=7.0.3300.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'、またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。

参照設定しているMSHTMLの実態は「Microsoft.mshtml.dll」なのですが、どうやらOSに標準では入っていない可能性があります。
(新規にWindows7 32bit IE9の環境を構築しましたが、ありませんでした)
PCに.NETの開発環境(VisualStudio、.NET SDK)やOfficeがインストールされていると、入っているようです。

ユーザにSDKやOfficeをインストールしてもらうのは敷居が高いので、それ以外では次の方法で回避できるようです。
・「Microsoft.mshtml.dll」を実行ファイルと同一の場所に格納する。(exeと一緒に配布)
 →今のところこれで問題なく動作しています。
・Type.InvokeMemberメソッドを利用して動作するようにプログラムを書き換える事で、DLLは使わない
 →私は未確認ですが、実施されている方がいらっしゃいます。

参考
http://blog.rocaz.net/2004/07/76.html
http://d.hatena.ne.jp/wave1008/20080813
http://d.hatena.ne.jp/mikihiro/20110717/p1
http://bbs.wankuma.com/index.cgi?mode=al2&namber=21847&KLOG=42

ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング
スポンサーサイト



前回に引き続き、IE8からIE9に変更した際の、おかしな点とその対策です。

・複数のタブを開いてIE制御している場合に、「objIE.Document.XXX」のようにプロパティやメソッドにアクセスすると、おかしな動作をする。(例外(0x800A01B6)が発生したり、IDがあるのにgetElementByIDで見つからなかったり)
 →「DirectCast(objIE.Document, mshtml.HTMLDocument).XXX」とすれば正常に動作。
  ただし.NETFramework4だと、mshtml.HTMLDocumentを使うとNo-Piaのコンパイルエラーが発生する。
  このエラーの取り方は不明。.NETFramework3.5にすればエラーは発生しない。

IE9を操作する場合は、Documentへのアクセスは基本的にはキャストして使うほうが良さそうです。

ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング
VB.NETでIEを操作するプログラムを組んでいますが、
IE8だと正常に操作できるものが、IE9だと操作に失敗する事があります。

ちゃんとした検証は行なっていませんが、今のところ以下のものがありました。

・radioボタンのチェック処理
 IE8だと「XXX.checked = True」で上手くいっていたものが、
 IE9だと「XXX.click()」にしないと動かない。

・Documentからエレメント一覧を参照すると、も抽出される
 「For Each tmp As mshtml.IHTMLElement In objIe.Document.all」
 でエレメントを1つずつ参照すると、もエレメントとして抽出されるので、
 対応が必要な場合がある。

・複数のタブでURLを表示した場合に、最初のタブへのアクセスには成功するが、
 2つ目以降のタブにアクセスすると、一部Documentのプロパティ参照で
 「NotSupportedException: HRESULT からの例外: 0x800A01B6」の例外が発生する。
 今のところ対処方法は不明。

他にもあると思うので、IE9でのプログラムは要注意ですね。

ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング
証券会社への自動発注の為に、IEを操作するプログラムを自作している人にお勧めなのが、
WatiNというフレームワークです。

WatiNはオープンソースのフレームワークで、
Webアプリケーションの動作テストの自動化を目的として作成されたものですが、 自動操作目的でも使うことができます。
.NETのアプリケーション開発時に組み込むことで、ブラウザの操作プログラムを簡単に作成することができます。

HPにまとめ中ですので、御覧ください。

ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング
かなり昔に宣言していましたが、
プログラムでインターネットアクセスする情報をまとめたサイトをやっと作成しました。
まだ完全とは言いがたいですが、大体の内容はできていると思います。
プログラムでネットサーフィン!
更新もぼちぼちしていっています。

ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング
前回の記事の続きです。

なんとか解決しました。
別に難しい現象が発生していたのではなかったのですが、盲点でした。

プログラムで説明した方がわかりやすいと思うので下記します。
Yahoo検索の処理です。

Submit用のメソッドとしてこんなのを作成し、
Public Function DocumentSubmit(ByVal formName As String) As Boolean
  objIE.Document.forms(formName).submit()
End Function


呼び側としてこうやって使っていました。
objIE.Document.Forms("sf1").All.Item("srchtxt").InnerText = "キーワード"
DocumentSubmit("sf1")


色々試してみると、
objIE.Document.forms(formName)
この使い方がダメっぽいです。
つまり、formsにName属性の文字で指定する場合は、変数ではダメみたいです。
objIE.Document.forms("srchtxt").submit()
直接こうするとうまくいきます。

WebBrowserで大丈夫なのでてっきり問題ないと思い込んでいました。。。
どうりで同じような問題が起きている人がいないわけです。

あー時間がもったいなかった。。。

ちなみに、変数でも数値(インデックス番号指定)ならうまくいきました。
Dim i as integer = 0
objIE.Document.forms(i).submit()



ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング
久しぶりにIE操作のプログラムを組んでいたら、
なぜかSubmitで例外が発生してハマっています。

Windows7+IE8+VB.NET2008の環境で、
単純にGoogle等の検索サイトでキーワードを入力し、検索ボタンをsubmitさせると、
以下の例外が発生しました。

・'System.Runtime.InteropServices.COMException = {"リモート プロシージャ コールに失敗しました。 (HRESULT からの例外: 0x800706BE)"}
・'System.Runtime.InteropServices.COMException = {"サーバーによって例外が返されました。 (HRESULT からの例外: 0x80010105 (RPC_E_SERVERFAULT))"}

色々試しているうちに、例外は2種類でてました。

原因として考えらえれるのは、こちらのサイトで詳しく書かれていますが、VISTAとIE7以降では保護モードがONになっている事。

しかし、保護モードを解除してもなおらなかったのです。

参照先のサイトではNavigateで失敗していますが、自分の場合はSubmitで例外。
信頼済のサイトに登録したりしましたがダメ。
オプションを色々いじくってもダメ。
検索しても同じような現象が起こっている人もいない・・・

これを回避する方法は今のところわかりません。
誰か知っている方がいれば教えていただけるとありがたいです。

とりあえずの回避策としては、submitではなく、submitのボタンをclickなら
問題なく行えます。

あとWebBrowserは保護モードとか関係なく動いてそうでした。

ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング
久方ぶりの更新です。

投資プログラムに関係しそうなネタがあったので。。。

VB.NETからUWSCのファイルを実行する方法です。

例えば"autologin.uws"というUWSCの定義ファイルを、VB.NETからUWSCで実行したい場合。

まず、こちら(http://www.atmarkit.co.jp/fwin2k/win2ktips/482ftype/ftype.html)
の記事を参考にして、UWSファイルをUWSC.exeに関連付けします。

VB.NETで以下のプログラムを書きます。

Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start("autologin.uws")
p.WaitForExit()

これで、UWSファイルが実行され、VB.NETはUWSの実行が終わるまで処理をまちます。
p.WaitForExitを行わなければ、UWSCの完了を待たずに処理を継続します。

ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング
以前はDDE通信のプログラムに関係する情報はあまり見つからなかったのですが、楽天RSS関係のプログラムをされている方がじわじわと増えているようで、情報が見つかるようになってきています。

巷にはDDE通信ができるDLLがあるので、今更情報は必要ないかなとも思いましたが、自分で自作したい!という人の為に、調べたついでに参考になるサイトを列挙しました。


http://msdn.microsoft.com/ja-jp/library/cc429260.aspx
マイクロソフトのサイトです。DDEの各関数について説明があります。

http://www.kumei.ne.jp/c_lang/sdk2/sdk_154.htm
http://www.kumei.ne.jp/c_lang/sdk2/sdk_155.htm
C言語ですが、プログラムサンプルやDDEの関数の使い方についての説明があります。
楽天RSSでは上記のホットリンクについての解説が参考になります。

http://plaza.rakuten.co.jp/acknight/diary/?ctgy=14
「VB.NETで楽天RSSからリアルタイム情報を取得する」記事にある、既成のDLLを使った解説が参考になります。

http://www2s.biglobe.ne.jp/~katsum/marketspeed/index.html
色々な言語でのサンプルがあります。

http://investor.a-auc.net/workshop.php?pd=index
C++ですが、サンプルが沢山あります。

自分のサイトも参考になればいいのですが、メモ書き見たいな感じで体系的に整理されていないので、ダメですねー。
でもトラブルやつまずいたこと等の情報は役に立つかもしれませんね。

ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング
技術メモ的なものです。

「楽天RSS疑似データ送信ツール」は、データを連続送信している最中にFormの「停止」ボタンを押せるようになっていますが、これはマルチスレッドで実装しているのではなく、Application.DoEventsしているだけです。

そこで、スレッドの勉強をかねてマルチスレッド化に挑戦してみました。
送信時は、送信用のスレッドを立ち上げて、そこでデータ送信するイメージです。

実装として、FormのLoadイベントではDdeInitializeとDdeNameServiceを実行し、送信用のスレッドで立ち上げ、そこではDdePostAdviseを実行するようにしました。
しかし、送信前のCreateStringHandleでハンドル?が取得できず(0がとれる。何かエラーがでてた)、データの送信ができませんでした。

初期化とデータ送信を異なるスレッドで実行する(それぞれのAPIを呼ぶ事ね)とダメになってるっぽいです。
ネットで色々調べてみたのですが、知識不足もあり、原因は解明できず。
STA/MTAが関係しそうな気もしますが、色々試してみるもダメ。
(MainからSTAで起動するようにしたり、スレッドをSTAで実行するようにしてみたり)

結局元のApplication.DoEventsに処理を戻すことにしました。
残念。。。

原因&対処がわかる方がいれば、教えていただけるとありがたいです。

ブログランキングのクリックにご協力お願いします<(__)>
FC2ブログランキング
blogRanking
くる株・株ブログランキング
株・投資ランキング