質問: ### 前提・実現したいこと 現在、Visual Studio2010/C++を使い、特定のUSBを直接リセットするソフトを作成したいと考えています。 場合によっては、C#での対応も検討している為、タグを追加させて頂きました。 ソフトから直接、USBリセットを行えるのがベストだと考えており調べた所、Microsoftの提供しているdevcon.exeにて簡単にデバイス操作ができるという事で、そちらを利用して進めている所です。(以下リセットアプリと表現) ### 発生している問題・エラーメッセージ Microsoftが提供しているdevcon.exeを、batを利用しUSBリセットをする事は出来ましたが、ソフトから直接行う事が出来ません。 動作環境:Windows7 64bit リセットアプリから直接コマンドを投げた場合(一瞬だけ出て消える) ``` エラーメッセージ devcon.ee failed ``` batやコマンドプロンクトで起動させた場合にWIN32アプリだった場合 ``` エラーメッセージ No matching devices found. ``` ### 試したこと 1batを管理者権限を一時的に外した状態で起動し、batから、devcon.exeを使用するように実装しました。 batを起動するアプリケーションを、x64アプリにする事で、batからのUSB操作は可能でした。 流れは、下記になります。 リセットアプリ(x64アプリ) ⇒ USBリセットbat(ショートカットリンク)(管理者権限) ⇒ USBリセットbat起動 ※WIN32アプリでは、USBリセットbatが動かない 2コマンドプロンクトにて、管理者権限あり・なしにてコマンドを入れ、devcon.exeを実行するが 上記「No matching devices found.」のメッセージが発生し、操作不能。 ### 補足情報(言語/FW/ツール等のバージョンなど) インストールしたのは、最新のWDKになります。 https://developer.microsoft.com/ja-jp/windows/hardware/windows-driver-kit ### 今、進めているbatを複数使った方法しか無いのでしょうか。 開発言語に特に拘っているわけではないですので、C#などで管理者権限を一時的に外した状態でのbat起動でも簡略化されるのでしょうか・・・。今の状態では、少し複雑なシステム構成だと思っています。 アドバイスを、頂きたいと思い、質問させて頂きました。 宜しくお願い致します。
回答: 参考までに。 WinUsb_ResetPipe function.aspx) 質問の内容からC#やc++から`devcon.exe`を使いたいと判断して、その方法を考えました。 ``` //Processオブジェクトを作成 System.Diagnostics.Process p = new System.Diagnostics.Process(); //ComSpec(cmd.exe)のパスを取得して、FileNameプロパティに指定 p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec"); //出力を読み取れるようにする p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardInput = false; //ウィンドウを表示しないようにする p.StartInfo.CreateNoWindow = true; //コマンドラインを指定("/c"は実行後閉じるために必要) p.StartInfo.Arguments = @"/c devcon.exe reboot "; //起動 p.Start(); //出力を読み取る string results = p.StandardOutput.ReadToEnd(); //プロセス終了まで待機する //WaitForExitはReadToEndの後である必要がある //(親プロセス、子プロセスでブロック防止のため) p.WaitForExit(); p.Close(); //出力された結果を表示 Console.WriteLine(results); ``` これだとどうでしょう?