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
 

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

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

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

 

System.InvalidCastException の初回例外

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

XML Web Serviceで名前空間を変更するとエラー

たとえば、XML Web Service のファイルで、namespace WebServiceAmedasを、namespace Uchukamen.WZero3 のように変更して、その他関連する場所も変更したつもりでも、なぜかエラーになる。何が関係しているのか不明・・・。リファクタリングでも面倒みてくれない。今は時間がないので、とりあえずメモ。

発生するエラーは、次の通り。

‘/’ アプリケーションでサーバー エラーが発生しました。


ランタイム エラー

説明: サーバーでアプリケーション エラーが発生しました。このアプリケーションの現在のカスタム エラー設定では、セキュリティ上の理由により、アプリケーション エラーの詳細をリモート表示できません。ただし、ローカル サーバー コンピュータで実行されているブラウザで表示することはできます。

詳細: このエラー メッセージの詳細をリモート コンピュータで表示できるようにするには、現在の Web アプリケーションのルート ディレクトリにある "web.config" 構成ファイル内に、<customErrors> タグを作成してください。その後で、この <customErrors> タグで "mode" 属性を "off" に設定してください。

ユーザー'(null)’のログインに失敗しました。エラーが発生した場合の対処法