そう.. USB/シリアル デバイス用の C# ユーティリティ アプリケーションがあります。セットアップ プロセス中にドライバをインストールしたいと思います。これに関する投稿がたくさんあることは知っていますし、msdn と stackoverflow の記事もたくさん読みましたが、うまくいかないようです。
ドライバーは問題ありません。ストック Arduino ドライバーなので、署名されており、Windows GUI からインストールできます (inf を右クリックしてインストールします)。アプリケーション用の Visual Studio セットアップ プロジェクトと、カスタム用の VB プロジェクトを作成しました。設定アクション。セットアップにより、ドライバがインストール フォルダにコピーされます。ドライバーのインストールは、「OnCommitted」メソッドから実行されます。ここでは、cmd.exe を呼び出してプロセスを生成し、何らかのコマンドを呼び出してドライバーをインストールしたいと考えています。
最初に「RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 132」を試してみたのですが、これで管理者権限を取得しているのですが、いつも失敗してしまいます。さまざまな場所で管理者権限を取得しようとしました: - 条件「AdminUser」で「起動条件」を追加しようとしました - VB から管理者として cmd を実行しようとしました (Process.Startinfo.Verb = "runas") のどれも上記は私の問題を解決しました。次に、別の方法でドライバーをインストールしようとしましたが、InfDefaultInstall.exe はほとんど問題ありませんが、マシンによっては失敗することがあり、その理由はわかりません。pnputil.exe は常に失敗します。これを行う公式の方法は、MSDN が示唆するように InstallHinfSection を呼び出すことだと思います。私はそれを使用したいと思います。Windows 7 以降をサポートする必要があります。
私が間違っていることについて何か考えはありますか?前もって感謝します!
ここに私のVBメソッドがあります:
Private Sub InstallDriverPNPUtil()
Dim infPath As String = """" + Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\arduino.inf" + """"
Dim processInfo As New ProcessStartInfo("CMD", "/C pnputil -i -a " + infPath)
processInfo.WindowStyle = ProcessWindowStyle.Hidden
Dim p As System.Diagnostics.Process = Process.Start(processInfo)
p.WaitForExit()
End Sub
Private Sub InstallDriverInfDefaultInstall()
Dim infPath As String = """" + Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\arduino.inf" + """"
Dim processInfo As New ProcessStartInfo("CMD", "/C InfDefaultInstall.exe " + infPath)
processInfo.WindowStyle = ProcessWindowStyle.Hidden
Dim p As System.Diagnostics.Process = Process.Start(processInfo)
p.WaitForExit()
End Sub
Private Sub InstallDriverInstallHinfSection()
Dim infPath As String = """" + Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\arduino.inf" + """"
Dim process As New Process()
process.StartInfo.FileName = "cmd.exe"
'fails with and without this
process.StartInfo.UseShellExecute = True
process.StartInfo.Verb = "runas"
process.StartInfo.Arguments = "/C RUNDLL32.EXE SETUPAPI.DLL,InstallHinfSection DefaultInstall 132 " + infPath
'MsgBox(process.StartInfo.Arguments, MsgBoxStyle.OkOnly, "InstallHinfSection")
process.Start()
process.WaitForExit()
End Sub