在VB6 以下指令是OK 的,可正常開啟執行程式
MyShellData = "C:\F4G\BIN\F4EDVPDE.EXE /LC /P"
ProcID = Shell(MyShellData, AppWinStyle.NormalFocus)
在VB2005 使用偵錯模式運行,執行也正常
可是 在發佈 之後執行程式卻出現
"您的應用程式發生未處理的例外狀況.如果您按一下 [繼續]......................找不到檔案"
的異常訊息
請問 在 VB2005 要怎樣 執行帶有參數指令的執行檔 ?
您好:
建議您改用 Process.Start 方法 搭配 ProcessStartInfo 建構函式 來執行,並加入 Try ... Catch 來判斷問題發生的原因:
使用範例
' 匯入命名空間。
Imports System.Diagnostics
'方法 1:
Process.Start("C:\F4G\BIN\F4EDVPDE.EXE", "/LC /P")
Dim p As New Process
' 方法 2:
Dim pi1 As New Diagnostics.ProcessStartInfo( _
"C:\F4G\BIN\F4EDVPDE.EXE", "/LC /P")
p.StartInfo = pi1
p.Start()
' 方法 3:
Dim pi2 As New Diagnostics.ProcessStartInfo( _
"C:\F4G\BIN\F4EDVPDE.EXE")
pi2.Arguments = "/LC /P"
p.StartInfo = pi2
p.Start()
卓立民 (Alex Chuo)●台北麵攤, 營養補給站, 吃飽了再上http://blog.xuite.net/alwaysfuturevision/liminzhang
通常這是程式設計師的責任,在 VB6 也是這樣,只是你沒注意過。
你用命令提示字元跑看看,會有相同的結果。
一般來說,程式預設安裝在:
C:\Program Files 下,所以你的字串可能變成:
MyShellData = "C:\Program Files\projname\bin\f4edvpde.exe /LC / P"
對 Windows 來說,他會認為你要執行的是
C:\Program.exe、C:\Program.bat、... 等以 Program 為名的可執行檔。
有沒有解決方案?有。從 Windows 95 年代就開始有人問,這個是超過 10 年的 FAQ 。
MyShellData = """C:\Program Files\projname\bin\f4edvpde.exe"" /LC / P"
如同在命令提示字元下:
"C:\Program Files\projname\bin\f4edvpde.exe" /LC / P
所以小朱會告訴你,就是找不到檔案。的確,C:\ 下面沒有叫 Program 的可執行檔。
所以卓老大會叫你用 Process.Start ,一方面這個比較好用,一方面傳回來的 Process 個體可以直接運用,不用在自己把 ProcId 轉成 Process 個體。
在 .Net 下已經有 Process 類別,用這個對於後續操控會更有彈性。我也建議用這個。
T.L. Cheng
這就是我覺得不解的部分
該應用程式安裝目錄就是 C:\F4G\bin\ 底下 ,路徑正確
在 Windows XP 下 開始 => 執行 直接輸入 "C:\F4G\bin\f4edvpde.exe /LC / P" 程式也正常開啟
當然 我也有用 章大師 的建議 使用 Process
說也奇怪 在偵錯模式運行是正常的
可是在程式發佈後,安裝後執行便失敗
使用 Try Catch 抓出之錯誤訊息如下
System.ComponentModel.Win32Exception: 參數錯誤。
於 System.Diagnostics.Process.StartWithShellExecuteEx(ProcessStartInfo startInfo)
於 System.Diagnostics.Process.Start()
於 WindowsApplication1.Form1.Button1_Click(Object sender, EventArgs e)
你的檔案字串如何組的?
一般來說,在開發環境下,執行檔是在
projectPath\bin\debug\app.exe
發布後,通常是
setupPath\app.exe
前面討論的 C:\Program Files 是針對 projectPath / setupPath 的差異
並未針對原先有 bin\debug 或 bin\release 等路徑差異做討論。
T.L. Cheng
感謝各位大師的指點
最後 我加上這一段
pi2.WorkingDirectory = "C:\F4G\BIN"
問題就解決了
' 方法 3:
Dim pi2 As New Diagnostics.ProcessStartInfo( _
"C:\F4G\BIN\F4EDVPDE.EXE")
pi2.WorkingDirectory = "C:\F4G\BIN"
pi2.Arguments = "/LC /P"
p.StartInfo = pi2
p.Start()
文章定位: