Internet Explorerを操作する為にMicrosoft.mshtml.dllを利用したプログラムを配布する際の問題。
開発環境か、Office用PIAをインストールしないと、Microsoft.mshtml.dllはインストールされない。従って、そのDLLを利用したプログラムを配布しても、利用したいPCにはインストールされていない可能性がある。
インストールされていないPCにMicrosoft.mshtml.dllをインストールするには、次のいずれかをインストールする必要がある。(上記2つは確認はとれていないが、おそらくOK)
- 2010:PIA Office 2010が必要
- 2007:PIA Office 2007が必要
- 2003:PIA Office 2003が必要(動作確認済)
- .NET Framework 2.0 SDK(動作確認済)
ただし、上記3つはインストールするのに、対応するMicrosoft Officeがインストールされている必要があり、条件が厳しい。.NET Framework 2.0 SDKならOfficeは不要だが、482.6MB。ひどい。
その為、公開するアプリと一緒にMicrosoft.mshtml.dllを配布することを考えて調べてみた。けれども、配布できるファイルがredist.txtに書いてあり、Microsoft.mshtml.dllは配布できるファイルでは無いようだ。更に言えば、Microsoft.mshtml.dll単体をインストールするには、グローバル・アセンブリ・キャッシュ(GAC)に登録する必要があるが、難易度が高い(私はそこまで研究していないが)。
参考情報として、
- Microsoft.mshtml.dllをアプリのフォルダに置くだけでは無理。
- DLLをリソースとしてEXEファイルに埋め込んで、Microsoft.mshtml.dllがインストールされていない時に、埋めこんだDLLを利用する方法も出来なかった。
- C#の場合、Jeffrey Richter: Excerpt #2 from CLR via C#, Third Edition embed the DLL file(s) into your EXE file
- VBの場合、Embedding DLL resources into Executable (No more ILmerge)
結論として、私は、Microsoft.mshtml.dllの利用をあきらめた。代わりに、Type.InvokeMemberメソッドを利用して操作する方法に変更した。参照IE9をType.InvokeMemberで操作
このDLLを利用する必要に迫られたのは、IE8からIE9になり、IE9を操作するのに今までのコードでは操作できなくなったからだ。そのため、こうして相当な労力を費やして調査と実験とを繰り返しているのだ。なんで、HTMLを簡単に利用できるようになっていないのだろう。とは言っても仕方がないので、対応せざるを得ないんですけどね。
Visual Studio 2010がクラッシュするようになったので、その原因追及。
拡張機能の、VS10x Code Map v2が、原因のようだとまず判明。この拡張機能を有効にしている場合で、IntelliSense(インテリセンス)が実行される時に、クラッシュするようだ。
次に、何の設定が問題になっているのか、原因の切り分けに多大な時間を費やした。
コードの量を減らしたり、参照を減らしたりしたり、****.vbproj.vs10xを削除したりしたが、クラッシュするのは変わらず。
最終的に、ClickOnceセキュリティ設定を有効にするのチェックを外して、あれこれ作業している内に、この現象が再現しなくなった。再現しないので原因ははっきりしないのだが、今まで大変に不便だったので直って良かった。
寄り引け5銘柄
シグナル配信に、http://www.msignal.info/signal2を掲載しました。
システムトレードの作り方
システムトレードの作り方の基本
を掲載しました。
トレードとは。
システムトレードとは。
についてです。
はっちゅう君+ アドイン開発
クリック証券のはっちゅう君+で、アドイン開発が出来るというので、簡単に株の売買が出来るようにならないか一日試行錯誤した。
結論から言うと、株の売買はもちろん、株のデータを受信してそれを表示することも、アドインとして作成することは出来ないことが判った。株のデータ受信はなんとかしてしまうことも出来るようだが、ヘルプにはそうした機能の記載は無い。最初、当然出来るだろうと思って、探しまくったけれど見つからず、どこか見落としているんだろうと思っていた。
ヘルプの説明とサンプルはC#なので、VB.netにするのに結構つまづいた。その点を書いておく。
例えば、サンプルでは、こうなっている。
namespace HelloWorld { public partial class Form1 : AddInForm { public Form1() { InitializeComponent(); } } }
これを、http://www.developerfusion.com/tools/convert/csharp-to-vb/ を利用してVB.netに変換すると、
Namespace HelloWorld Public Partial Class Form1 Inherits AddInForm Public Sub New() InitializeComponent() End Sub End Class End Namespace
になる。
けれど、
Namespace HelloWorld
End Namespace
はいらないので、消すこと。
PHP内でTokenを使う
<?php $original= "[current-page-url]"; $original= token_replace($original, $type = 'global', $object = NULL, $leading = '[', $trailing = ']'); if ($original == "http://www.msignal.info/home") { ・・・処理・・・ } ?>
DrupalのPHP内でTokenを利用する方法がよく判らず難儀した。結局、上記のようにしたが、もっと上手な方法があるはず。
current-page-urlが、http://www.msignal.info/home の時に、処理をするスクリプト。