Windows 7 Sensor APIのCOM Wrapper

このポスト、書いて公開するのをすっかり忘れていることに、今気がつきました。既にNESLが出てしまったので、このままお蔵入りさせようかとも思ったのですが、考えてみたらガジェットでセンサーAPI使う時、これの類がないと駄目じゃん。ってことで、3ヶ月遅れぐらいで公開です。以下、当時のままポストします。 お疲れ様です。 結構前からTwitterでつぶやいたり、PDC TokyoやTech Fieldersセミナーのネタでちら見せしてきましたが、COM Wrapper作ってCodePlexに登録してあります。これ使うと、Windows 7 Sensor & Location Platformのセンサーのほうの機能が、SilverlightのOOBで使えたり、デスクトップガジェットで利用できたりするんですね。 http://sensor7dotnet.codeplex.com まぁ、久々のNative系プログラミングだったので、結構しんどかったですが、もしよければ開発に参加してくださいまっせ。 で、使い方ですが、ビルドして出来上がったやつ、SensorCOMW.exe、を引数 /RegServer 付けてコマンドラインでまずは実行してください。これで、このWrapperがレジストリに登録されますんで。そして、Silverlightのアプリケーション作って、以下のような感じで使う訳っす。 using System.Runtime.InteropServices.Automation;…    if (Application.Current.IsRunningOutOfBrowser){ // OOBで実行していることを確認        // センサーCOM Wrapperを取り出す。取り出したオブジェクトはSensorManagerに相当        dynamic sensorcom = AutomationFactory.CreateObject(“Sensr7COMW.DispSensorManager”);        dynamic sensors = sensorcom.GetAllSensors(); // すべてのセンサーを取得        dynamic aSensor = sensors.GetAt(0); // センサーの取出し        // TypeIdを指定して特定の種別のセンサーを取り出す。        dynamic lightSensor = sensorcom.GetSensorsByTypeId(“{97F115C8-599A-…”});  後は、コードを見てお試しください。 …てな感じで。ガジェットで使う方法は、また別途ポストしますね。


Windows 7 Sensor & Location Platformを使ってみよう – その5

さて、5回目、さっそくいってみようっ 4回目までは、本質が見えにくくならないよう、Managedコードでの使い方を紹介してきました。(Sensor & Location Platformの概念や使い方はわかっていただけましたか?)しかし、やはり場合によっては、COMを使った、Nativeコード開発も必要です。ざっとVC++(Native)でプログラムを組む場合のコードを、まずは、紹介してしまいます。 センサーリストの取得: // SensorMangaerのCOMインターフェイス取り出しCComPtr<ISensorManager> pSensorManager; HRESULT hr = CoCreateInstance(  __uuidof(SensorManager),NULL,CLSCTX_INPROC_SERVER,  __uuidof(ISensorManager),(LPVOID*)&pSensorManager);// SensorCollectionインターフェイスの作成CComPtr<ISensorCollection> pSensorCollection;hr = pSensorCollection.CoCreateInstance(CLSID_SensorCollection);// センサーリスト(照度センサー)を取得hr = this->m_pSensorManager->GetSensorsByType(SENSOR_TYPE_AMBIENT_LIGHT, &pSensorCollection); まずは、こんな感じです。もちろん実際には、HRESULT型の戻り値はちゃんとチェックして(!SUCCEEDED(hr)って感じ)エラーの場合には処理が必要です。また、”Sensors.h”の#includeも必要になります。Managedのときと違って、長ったらしいですね。全てのコードを見せていくのは煩雑なので、以後、Windows API Code Packで使っているCOM Interopの紹介を通じて、読者の皆さんに使い方のあたりをつけてもらいます。 Code PackのSensorsプロジェクトのObjectModelフォルダーにある、SensorManager.csを見てください。この中で、SensorManagerクラスが定義されていて、GetAllSensorsやGetSensorsByCategory等のメソッドは、内部で、nativeISensorManagerというインスタンスを使っているのがわかります。このnativeISensorManagerをC#テキストエディタ上で選択し、右クリック→”定義へ移動”を選択すると、InteropフォルダーのISensorManager.csが開き、nativeISensorManagerに表示が変わります。そこには、 using System.Runtime.InteropService;…[ComImport, InterfaceType( ComInterfaceType.InterfaceIsIUnknown ), Guid( “BD77DB67-45A8-42DC-8D00-6DCF15F8377A” )]internal interface nativeISensorManager{….   [PreserveSig]    HRESULT GetSensorsByCategory(        [In, MarshalAs( UnmanagedType.LPStruct )] REFSENSOR_CATEGORY_ID sensorCategory,        [Out, MarshalAs( UnmanagedType.Interface )] out ISensorCollection ppSensorsFound ); という、定義がなされています。インターフェイスに付与されたComImportやPreserveSig、In,…