none
Windows 10 において Location API で位置情報の取得ができない。 RRS feed

  • 質問

  • Windows 10 Pro 上のデスクトップアプリを Visual Studio Express 2015 にて開発しています。

    https://msdn.microsoft.com/ja-jp/library/windows/desktop/dd317731(v=vs.85).aspx
    にある Location API を使用したサンプルを、
    Windows 8.1 で実行したところ無事位置情報が取得できたのですが、
    Windows 10 では位置情報が取得取得できませんでした。
    ソースをトレースしてみると `GetReport` が 0x800700e8 = HRESULT_FROM_WIN32(ERROR_NO_DATA) を返している状態でした。

    MSDN を調べ以下の情報まではたどり着きました。
    https://msdn.microsoft.com/ja-jp/library/windows/desktop/dd317626(v=vs.85).aspx
    > HRESULT_FROM_WIN32(ERROR_NO_DATA)
    > データがありません。この原因として、エラーまたは位置プロバイダーが使用できないことが考えられます。

    しかし、"位置情報プロバイダー" がなぜ Windows 10 で使用できないのかがわからず調査が頓挫してしまっている状況です。

    Windows 8.1 環境は GPS を内蔵していないマシンで、USB の GPS レシーバーを挿した状態と挿していない状態で確認しております。
    Windows 10 環境では GPS 内蔵マシンと非内蔵マシンで確認しています。

    何かお知恵拝借できればと書きこみをさせていただきました。

    2017年2月27日 13:59

回答

  • 同じサンプルプログラムを動かしてみて再現しました。同じく Windows 10 の GPS 内蔵マシンと非内蔵マシンで確認しました。

    どうも位置情報取得時に OnStatusChanged 関数の中で SetEvent 関数が呼ばれてしまうため、CoWaitForMultipleHandles 関数がすぐに制御を返してしまっているようでした。REPORT_RUNNING で待機を終わらせる必要はないと思いますので、OnStatusChanged 関数の中の下記の部分を

    IFACEMETHODIMP OnStatusChanged(REFIID /*reportType*/, LOCATION_REPORT_STATUS status)
    {
    	//if (REPORT_RUNNING == status)
    	//{
    	//	::SetEvent(_hDataEvent);
    	//}
    	return S_OK;
    }

    とコメントアウトしたところ、Windows 10 でも位置情報を得ることができました。
    2017年2月28日 1:22

すべての返信

  • 同じサンプルプログラムを動かしてみて再現しました。同じく Windows 10 の GPS 内蔵マシンと非内蔵マシンで確認しました。

    どうも位置情報取得時に OnStatusChanged 関数の中で SetEvent 関数が呼ばれてしまうため、CoWaitForMultipleHandles 関数がすぐに制御を返してしまっているようでした。REPORT_RUNNING で待機を終わらせる必要はないと思いますので、OnStatusChanged 関数の中の下記の部分を

    IFACEMETHODIMP OnStatusChanged(REFIID /*reportType*/, LOCATION_REPORT_STATUS status)
    {
    	//if (REPORT_RUNNING == status)
    	//{
    	//	::SetEvent(_hDataEvent);
    	//}
    	return S_OK;
    }

    とコメントアウトしたところ、Windows 10 でも位置情報を得ることができました。
    2017年2月28日 1:22
  • ご提示いただいたソースで当方の環境にて (GPS有/無環境ともに) 取得することができました。
    大変助かりました。
    ありがとうございます。
    2017年2月28日 6:12