C++、C++ / CLI、C# 適材適所の BOF

TechEd Yokohamaで、「C++、C++ / CLI、C# 適材適所の BOF 」があり、デバイスの検出を例に説明があり、興味深く聞かせていただきました。
 
デバイスの検出関連はこれまで触ったことがなかったので、URLなどをいくつかメモ。
 
 
WM_DEVICECHANGE、struct _DEV_BROADCAST_HDR などの定義
  C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\Dbt.h
  C:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\PocketPC2003\Include\dbt.h
  C:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\Smartphone2003\Include\dbt.h

 WindProc にフックを掛けるだけであれば、InterOpはいらず、WinProcをオーバーライドすればよい。

    // A device has been added to or removed from the system.
    // Windows NT 4.0 and Windows Me/98/95:  This value is not supported.
    private const int DBT_DEVNODES_CHANGED = 0x0007;
    private const int WM_DEVICECHANGE = 0x0219;
 
    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
      if (m.Msg != WM_DEVICECHANGE)
      {
        base.WndProc(ref m);
        return;
      }
      switch ((int)(m.WParam))
      {
         ….
        case DBT_DEVICEARRIVAL:
          MessageBox.Show("DBT_DEVICEARRIVAL");
          break;
        case DBT_DEVICEREMOVECOMPLETE:
          MessageBox.Show("DBT_DEVICEREMOVECOMPLETE");
          break;
        ….
        case DBT_DEVNODES_CHANGED:
          MessageBox.Show("DBT_DEVNODES_CHANGED");
          break;
        ….
      }
      base.WndProc(ref m);
    }
 
なお、USBドライブが追加された場合には、WParam が DBT_DEVNODES_CHANGED でメッセージが飛んでくる。
 
問題はこの後どれだけ複雑な InterOp が必要かどうかで、複雑な構造体(ネストしていると最悪)が必要な場合など、C++/CLI  でのつなぎは可能性の1つとして面白そう。でも、自分の場合MFC触ったことないので別のアプローチ取るしかないですね。orz
 

WZero3 で、GPS?!

PRO’ LOGUE さんのところで、[03es] 擬似GPSでGoogleMap…MimicGPS という記事が紹介されています。
明日からキャンプなんですが、カーナビついてないもので、これは!と思い、試してみました。
 
以下、手順です。
 
1. レジストリエディタで
   HKEY_LOCAL_MACHINE\ControlPanel\GPS Settings の
   Hide 1 を Hide 0
   に変更し、再起動すると、GPSコントロールパネルが表示された。
2. レジストリエディタで
   HKEY_LOCAL_MACHINE\Drivers\BuiltIn\GPSIDレジストリ内に
   文字列キー(値:Dll/値のデータ:GPSID.dll)を追加する。
3. [スタート]→[設定]→[システム]→[GPS]
   より、
   【プログラム】タブ内のGPSプログラムポートをCOM0に設定する。
   【ハードウェア】タブ内は設定をする必要は特に無し。
   【アクセス】タブ内の□GPSを自動的に管理するにチェックをつける。
4. MimicGPSインストール
   公開先からダウンロードして実行する。
   測位開始をタップする。
   MimicGPS はそのまま実行しておく。
5. WZero3 から、www.google.co.jp/gmm にアクセスして、
   Google Map をインストールする。
   [メニュー]→[現在地を検出] により、現在位置を表示する。
 
これで、無事  WZero3 WS004SH でも動きました。
 
こんなことを考える人がいるなんて・・・・すごい!

ジェネリクスの場合のFindの実装パターン

ジェネリクスの場合のFindの実装パターンの覚書
 
List<AmedasLocation> ameLocation で、Find したい場合の例 
 
  // メニューと一致するAmedasLocation情報を検索
 
AmedasLocation al = ameLocation.Find(
    delegate(AmedasLocation aloc)
    {
      return aloc.Text == ((MenuItem)sender).Text;
    }
  );

結構使いそうだけど、すぐ忘れそうなのでメモ。

 

Web Service の Web サイトの発行時の単なるメモ

Web Service の Web サイトの発行時の単なるメモ。

たまにしか、Web Service の発行はしないので、毎回迷う。メモっておこう。

Web Service の発行時のターゲットの場所
 
この下に、ソリューションのファイル(Service.asmx, etc) がコピーされる。
 
Virtual Directory が作成される。そこにホスティング管理ソフトより Script の実行権を付与する必要がある。
 
Web Service の発行時のターゲットの場所に、
を指定してしまうと、既存のファイルが消されてしまい、復旧が面倒なので注意。
 
 
 

WZero3DeAmedas に関するバグレポート・要望など

WZero3DeAmedas を公開します。
WZero3DeAmedas に関するバグレポート・要望など、ありましたらこちらにコメントお願いします。
 
元記事はこちら。
 
現在の最新バージョンは、WZero3DeAmedas V2.0.4.0 (ベータ4)です。
 
ツールのダウンロードは、
 
2007/9/9

2.0.4.0 Beta4

Beta4バージョン。

    • レーダー・降水ナウキャストを過去2時間、予想1時間、10分刻みに修正。
    • スレッド動作中にアプリを終了できないバグを修正。
    • 拡大・縮小率の計算が間違っていたので、修正。これに伴い、拡大縮小率を次のように変更。
      全体表示(内接)→全体表示(外接)→150%→200%→400%

 

無線LAN接続切替ツール バージョンアップ

WZero3 で、無線LAN接続切替ツール の1,5,6 を使用していましたが、1.5.6(1.5.5も)には重大なバグがありました。ということなので、最新版の1.5.7 をインストール。Visual Studio で開発中のソフトを USB 接続でダウンロードしながら使っていると、USBの抜き差し後にW-SIMが無効になって、電話がかけられなくなるという問題があった。ひょっとしたら、この影響かもしれない。とりあえず、アップデートして様子を見てみることにします。
 

bLaunch のアイコンの背景色

W-Zero3 でプログラムを作っていて、ほぼ完成したのでアイコンをまともにしようとして、はまりました。
bLaunch というローンチャーを使用していますが、実はこれには背景色でマゼンタが使われているみたいです。
このため、画像では本来 AmeDas と表示されるべき所が、Am Das となって、eが抜けています。
本来は、icon の設定の画像にあるように、"e"だけマゼンタになっています。
最初、すべてマゼンタにしていたので、なぜかbLaunch にアイコンが表示されず、数時間試行錯誤してしまいました。orz
馬鹿みたい・・・
 
なお、bLaunch に対して、Visual Studio から exe を配置しても、アイコンは変更されません。
W-Zero3を再起動して、bLaunch がアイコンを再読み込みする必要があります。
 
 

System.InvalidCastException の初回例外

.NET Compact Framework 2.0 で連続してBitmap を作成すると、
‘System.InvalidCastException’ の初回例外が System.Drawing.dll で発生しました。
の例外が上がる?
詳しく試してないけれども、Bitmapを連続して作成し、PictureBoxのImageに次々に張り付けていくと、かなりの頻度でこの例が上がる。
そんなことをするとメモリの回収が間に合わず、そもそもそのような実装はまずいのだけど。
 
時間のあるときに試してみようっと。
とりあえずメモ。