というわけで改めまして「Win32 Location API(COMコンポーネント)」を使って現在の緯度経度を取得したいのですが行き詰ってしまいました。どなたか教えてください。
また、せっかくなのでHSP3でcomも使えるようになりたいので、HSPのCOMオブジェクト操作命令を使った方法で解決したいと考えています。Powershell、Windows.Devices.Geolocation、System.Device.Locationなどの利用は、無しの方向で(新規スレッド立てる方向で)お願いします。
まずは、現状の説明から。
私は今までCOMは避けていたので、こちらのサイトとHSPのマニュアルを参考にいろいろと試していますがうまくいっていません。HSP2時代の古いものですが、こちらのサイト以上に詳しいサイトを見つけることができませんでした。他にいいサイトがあれば知りたいです。
HSPからのCOM操作 - ちょくとのページ
https://chokuto.ifdef.jp/urawaza/com/index.html
IID Explorerは入手できないので、COMView https://www.japheth.de/COMView.html を参考に作業しています。OLE/COM オブジェクト ビューア https://learn.microsoft.com/en-us/windows/win32/com/ole-com-object-viewer も試してみたのですがこちらはよくわからずでした。
HSP3.7 プログラミング・マニュアル 4.10 COMコンポーネント呼び出し
https://www.onionsoft.net/hsp/v37/doclib/hspprog.htm#COM_COMPONENT
使用しようとしているCOMコンポーネントはこちら。
Location API - Microsoft
https://learn.microsoft.com/ja-jp/windows/win32/api/_winlocation/
とりあえずCLSIDとIID、使いたいメソッドが必要らいしので調べました。GUIDは、locationapi.hから抽出しています。
あとは、ILatLongReportインターフェイスのメソッドを使えば緯度経度が出てくるはず。
#define CLSID_Location "{E5B8E079-EE6D-4E33-A438-C87F2E959254}" #define CLSID_DefaultLocation "{8B7FBFE0-5CD7-494a-AF8C-283A65707506}" #define CLSID_LatLongReport "{ED81C073-1F84-4ca8-A161-183C776BC651}" #define CLSID_CivicAddressReport "{D39E7BDD-7D05-46b8-8721-80CF035F57D7}" #define IID_ICivicAddressReport "{C0B19F70-4ADF-445d-87F2-CAD8FD711792}" #define IID_IDefaultLocation "{A65AF77E-969A-4a2e-8ACA-33BB7CBB1235}" #define IID_ILatLongReport "{7FED806D-0EF8-4f07-80AC-36A0BEAE3134}" #define IID_ILocation "{AB2ECE69-56D9-4F28-B525-DE1B0EE44237}" #define IID_ILocationEvents "{CAE02BBF-798B-4508-A207-35A7906DC73D}" #define IID_ILocationPower "{193E7729-AB6B-4b12-8617-7596E1BB191C}" #define IID_ILocationReport "{C8B7F7EE-75D0-4db9-B62D-7A0F369CA456}"
ILatLongReport::GetLatitude 緯度
ILatLongReport::GetLongitude 経度
ちなみにProgIDは、"LocationApi"のようです。
以上を踏まえて、試してみたのがこちら。
変数latに緯度を取得するつもりで書いたものです。GPSが搭載されていないパソコンでも、設定された既定の場所が表示されるはず?
#define IID_ILatLongReport "{7FED806D-0EF8-4f07-80AC-36A0BEAE3134}" newcom LocationApi, "LocationApi" mes stat querycom laLLRpt, LocationApi, IID_ILatLongReport mes stat comres res laLLRpt->"GetLatitude" lat ; #Error 39 -->外部オブジェクトの呼び出しに失敗しました ;LocationApi->"GetLatitude" lat ; 警告なしで終了
オブジェクトの作成まではうまくいっているようですが、最後の2行のどちらを試してもエラーか強制終了するだけで期待通り動作しませんでした。
エラーは出てないけど、querycomの使い方間違ってるのかなと、次に試したのがこちら。
こちらはオブジェクト作成時にエラーとなりました。何も間違っている気がしないのですが、何かを間違えているようです。
#define CLSID_LatLongReport "{ED81C073-1F84-4ca8-A161-183C776BC651}" #define IID_ILatLongReport "{7FED806D-0EF8-4f07-80AC-36A0BEAE3134}" #usecom ID_ILatLongReport IID_ILatLongReport CLSID_LatLongReport newcom laLLRpt, ID_ILatLongReport mes stat ; エラー ;comres res ;laLLRpt->"GetLatitude" lat ; #Error 39 -->外部オブジェクトの呼び出しに失敗しました ;LocationApi->"GetLatitude" lat ; #Error 21 -->サポートされない機能を選択しました
そして、もしかしてILatLongReport::GetLatitudeを使う前にILocation::GetReportを使わないといけない?などと考えてあがいてみたのがこちら。
という感じでエラーとなります。
#define CLSID_Location "{E5B8E079-EE6D-4E33-A438-C87F2E959254}" #define IID_ILocation "{AB2ECE69-56D9-4F28-B525-DE1B0EE44237}" #define CLSID_LatLongReport "{ED81C073-1F84-4ca8-A161-183C776BC651}" #define IID_ILatLongReport "{7FED806D-0EF8-4f07-80AC-36A0BEAE3134}" newcom LocationApi, "LocationApi" mes stat querycom laL, LocationApi, IID_ILocation mes stat ;#usecom ID_ILocation IID_ILocation CLSID_Location ;newcom laL, ID_ILocation ;mes stat querycom laLLRpt, LocationApi, IID_ILatLongReport mes stat comres res mcall laL, "GetReport", IID_ILatLongReport, laLLRpt ;#Error 30 -->無効な名前がパラメーターに指定されています
#comfuncを使えば解決するのかな?とも考えたのですが、メソッドのインデックスをどこでどう調べればいいかわからずという状況です。
どこを間違えているのかわからず、そもそも何かを理解してないのか、次の手段がなくお手上げとなっています。
エラーが出る原因と対策法方法について、どなたか教えていただけないでしょうか。