質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

0回答

3890閲覧

WinUSBのデバイスをUWPから制御する方法について

tokiyam

総合スコア13

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

1クリップ

投稿2016/09/29 15:23

現在、FORMアプリでは、C#を使用してWinUSBを使ってインストールしたデバイスに接続し問題なくアクセスできています。
今回、UWPアプリで同様なことをしたいと、VS2015 Community からUWPアプリ(C#, ユニバーサル)のプロジェクトを作成してテストしております。
FORMアプリで動作している C#のコードを2本をそのプロジェクトに読み込んで、まずはデバイスにアクセスできるかをテストしました。
//--------------------------------------------------------------------------------------
// USB デバイスをさがしてデバイスハンドルを取得する、成功はTrueを返す
//--------------------------------------------------------------------------------------
public static Boolean FindMyDevice()
{
Boolean deviceFound;
String devicePathName = "";
Boolean success;

try { if (!(OpenFlag)) { // Convert the device interface GUID String to a GUID object: System.Guid winUsbDemoGuid = new System.Guid(WINUSB_DEMO_GUID_STRING); // Fill an array with the device path names of all attached devices with matching GUIDs. deviceFound = myDeviceManagement.FindDeviceFromGuid(winUsbDemoGuid, ref devicePathName); if (deviceFound == true) // true が返りOK { success = myWinUsbDevice.GetDeviceHandle(devicePathName); if (success) // false 返りNG { OpenFlag = true; myDevicePathName = devicePathName; } Else ・ ・

上記のコードで、デバイスは見つかるけれども、そのデバイスのハンドルを得ることに失敗しています。
読んでいるコードは別のクラスの・・・
internal Boolean GetDeviceHandle(String devicePathName)
{
myDevInfo.deviceHandle = FileIO.CreateFile
(devicePathName,
(FileIO.GENERIC_WRITE | FileIO.GENERIC_READ),
FileIO.FILE_SHARE_READ | FileIO.FILE_SHARE_WRITE,
IntPtr.Zero,
FileIO.OPEN_EXISTING,
FileIO.FILE_ATTRIBUTE_NORMAL | FileIO.FILE_FLAG_OVERLAPPED,
0);

if (!(myDevInfo.deviceHandle.IsInvalid)) // .IsInvalid が true となりNG { return true; } else { return false; } }

・・・で、どうしてもNGとなります。
それはそうと、このプロジェクトで、このクラスファイルを組み込んだときに、幾つかのエラーが表示されました。そのままではRUNできないので、下記の修正をいたしました。
'----------------------------

  1. deviceHandle.Close の代わりに deviceHandle.Dispose とした。
    //myDevInfo.deviceHandle.Close();
    myDevInfo.deviceHandle.Dispose();
    Closeにエラーマークが付いたので、インテリセンス機能で Disposeに変更した。
  2. m.LParam がエラーになる
    internal Boolean DeviceNameMatch(Message m, String mydevicePathName)メソッドの中で・・・
    Marshal.PtrToStructure(m.LParam, devBroadcastHeader);
    LParam がエラーとなる。このメソッドは他から呼ばれていないようなので、この行をレムとした。
  3. Marshal.PtrToStringAuto(pDevicePathName) がエラーとなる、これは何箇所もあります。
    インテリセンスによると、PtrToStringAutoは無いけれどPtrToStringUni, PtrToStringAnsi, PtrToStringBTRがあるので Ansiに変更した。
  4. MessageBox.Show 関係はエラーとなるので・・・
    static async void DspMessage(String mess)
    {
    MessageDialog md = new MessageDialog(mess, "Message");
    await md.ShowAsync();
    }
    ・・・に入れ替えた。
  5. Application.Exit();がエラーとなるので、Application.Current.Exit();に入れ替えた。

'----------------------------
プロジェクトのプラットフォームが FORMから UWPに変わるだけで、C#のコードはそのまま通らないのですね。デザイン(XAML)とそのビハインドコードさえ書き変えれば動くのではないかと思っていました。
いずれにしろ、デバイスハンドルを取得できなければ、デバイスに対してUSBの読み書きができません。
何が問題なのか、どなたかご指摘を願えませんでしょうか。
よろしく、お願い申しあげます。
なお、同様のコードで WPFでも同じようなエラーが出て、修正したものは動作しています。

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード

ここにご自身が実行したソースコードを書いてください

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問