Okay.so にようこそ。ここではコミュニティメンバーに質問したり、回答を得ることができます。

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

0 評価
現在、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の読み書きができません。
何が問題なのか、どなたかご指摘を願えませんでしょうか。
よろしく、お願い申しあげます。
質問 TOKYAM (120 ポイント)

回答内容

メールアドレスは上記の通知にのみ使用されます。
アンチスパム認証:
ログイン または 登録 することで以後アンチスパム認証が不要になります。