現在、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できないので、下記の修正をいたしました。
'----------------------------
- deviceHandle.Close の代わりに deviceHandle.Dispose とした。
//myDevInfo.deviceHandle.Close();
myDevInfo.deviceHandle.Dispose();
Closeにエラーマークが付いたので、インテリセンス機能で Disposeに変更した。 - m.LParam がエラーになる
internal Boolean DeviceNameMatch(Message m, String mydevicePathName)メソッドの中で・・・
Marshal.PtrToStructure(m.LParam, devBroadcastHeader);
LParam がエラーとなる。このメソッドは他から呼ばれていないようなので、この行をレムとした。 - Marshal.PtrToStringAuto(pDevicePathName) がエラーとなる、これは何箇所もあります。
インテリセンスによると、PtrToStringAutoは無いけれどPtrToStringUni, PtrToStringAnsi, PtrToStringBTRがあるので Ansiに変更した。 - MessageBox.Show 関係はエラーとなるので・・・
static async void DspMessage(String mess)
{
MessageDialog md = new MessageDialog(mess, "Message");
await md.ShowAsync();
}
・・・に入れ替えた。 - Application.Exit();がエラーとなるので、Application.Current.Exit();に入れ替えた。
'----------------------------
プロジェクトのプラットフォームが FORMから UWPに変わるだけで、C#のコードはそのまま通らないのですね。デザイン(XAML)とそのビハインドコードさえ書き変えれば動くのではないかと思っていました。
いずれにしろ、デバイスハンドルを取得できなければ、デバイスに対してUSBの読み書きができません。
何が問題なのか、どなたかご指摘を願えませんでしょうか。
よろしく、お願い申しあげます。
なお、同様のコードで WPFでも同じようなエラーが出て、修正したものは動作しています。
###前提・実現したいこと
ここに質問したいことを詳細に書いてください
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。
###発生している問題・エラーメッセージ
エラーメッセージ
###該当のソースコード
ここにご自身が実行したソースコードを書いてください
###試したこと
課題に対してアプローチしたことを記載してください
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
あなたの回答
tips
プレビュー