[转]获取Setup文件的运行路径
生活随笔
收集整理的這篇文章主要介紹了
[转]获取Setup文件的运行路径
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
昨天項目中因為需要在安裝時做配置,而在打包之前是不知道配置的具體信息的。用InstallShield來做打包好像做這樣的處理比較方便,但是使用Visual Studio創建安裝項目來打包時好像不是那么容易,在網上查找相關的資料一直沒有找到很好的方法來直接獲取其運行路徑,網上有人說繼承Installer來做,但是無論如何所能取得的路徑是系統msiexec.exe的運行路徑,所以這種方法看起來是行不通了。獲取其安裝路徑也是非常簡單而且方法有很多種。
??? 想到以前在做項目時要求程序只能有一個運行實例,這種方法來處理豈不是很好,換種思路來處理:先取得當前運行的所有Process然后再找到那個Setup或是*.msi那不就好了。想到著就趕快動手試驗,在程序中加上處理代碼,很快搞定。
Process[]?processes?=?Process.GetProcesses();
????????????string?tmp?=?"";
????????????int?i?=?0;//調試時為了查找線程的個數
????????????foreach?(Process?pro?in?processes)
????????????{
????????????????//MSI?Title即為你的打包文件在運行時顯示的標題
????????????????if?(pro.ProcessName.ToLower()?==?"msiexec"?&&?pro.MainWindowTitle?==?"MSI?Title")
????????????????{
????????????????????//這里在Vista下測試時因為要讀寫文件(由于Vista使用了UAC來增強安全性,
????????????????????//要求必須以管理員身份運行,而直接運行msi文件只能以普通權限來運行),
????????????????????//所以不讓用戶直接運行MSI文件,而要求必須從Setup.exe文件運行,
????????????????????//如果你不需要在Vista下使用則不用如此處理
????????????????????MessageBox.Show("Please?run?setup.exe",?"ERROR",?MessageBoxButtons.OK,?MessageBoxIcon.Error);
????????????????????throw?new?InstallException("run");
????????????????}
????????????????else?if?(pro.ProcessName.ToLower().IndexOf("setup")?&&?pro.MainWindowTitle?==?"MSI?Title")
????????????????{//判斷ProcessName是否是setup,并且其MainWindowTitle為你的安裝文件的Title
????????????????????tmp?=?tmp?+?pro.Id?+?""?+?pro.ProcessName?+?Environment.NewLine;
????????????????????tmp?=?tmp?+?"?"?+?i.ToString()?+?"="?+?pro.MainModule.FileName?+?Environment.NewLine;//pro.MainModule.FileName即為Setup的完整運行路徑
????????????????????tmp?=?tmp?+?"?"?+?i.ToString()?+?"="?+?pro.MainWindowTitle?+?Environment.NewLine;
????????????????}????????????????
????????????}
????????????MessageBox.Show(tmp);
不過此方法有點不妥之處,那就是如果用戶改變了Setup.exe或是*.msi的文件名就不好處理了,為了防止在用戶更改文件名后運行安裝,你可以在程序中加上判斷文件名更改的處理,給用戶提示。
??? 想到以前在做項目時要求程序只能有一個運行實例,這種方法來處理豈不是很好,換種思路來處理:先取得當前運行的所有Process然后再找到那個Setup或是*.msi那不就好了。想到著就趕快動手試驗,在程序中加上處理代碼,很快搞定。
Process[]?processes?=?Process.GetProcesses();
????????????string?tmp?=?"";
????????????int?i?=?0;//調試時為了查找線程的個數
????????????foreach?(Process?pro?in?processes)
????????????{
????????????????//MSI?Title即為你的打包文件在運行時顯示的標題
????????????????if?(pro.ProcessName.ToLower()?==?"msiexec"?&&?pro.MainWindowTitle?==?"MSI?Title")
????????????????{
????????????????????//這里在Vista下測試時因為要讀寫文件(由于Vista使用了UAC來增強安全性,
????????????????????//要求必須以管理員身份運行,而直接運行msi文件只能以普通權限來運行),
????????????????????//所以不讓用戶直接運行MSI文件,而要求必須從Setup.exe文件運行,
????????????????????//如果你不需要在Vista下使用則不用如此處理
????????????????????MessageBox.Show("Please?run?setup.exe",?"ERROR",?MessageBoxButtons.OK,?MessageBoxIcon.Error);
????????????????????throw?new?InstallException("run");
????????????????}
????????????????else?if?(pro.ProcessName.ToLower().IndexOf("setup")?&&?pro.MainWindowTitle?==?"MSI?Title")
????????????????{//判斷ProcessName是否是setup,并且其MainWindowTitle為你的安裝文件的Title
????????????????????tmp?=?tmp?+?pro.Id?+?""?+?pro.ProcessName?+?Environment.NewLine;
????????????????????tmp?=?tmp?+?"?"?+?i.ToString()?+?"="?+?pro.MainModule.FileName?+?Environment.NewLine;//pro.MainModule.FileName即為Setup的完整運行路徑
????????????????????tmp?=?tmp?+?"?"?+?i.ToString()?+?"="?+?pro.MainWindowTitle?+?Environment.NewLine;
????????????????}????????????????
????????????}
????????????MessageBox.Show(tmp);
不過此方法有點不妥之處,那就是如果用戶改變了Setup.exe或是*.msi的文件名就不好處理了,為了防止在用戶更改文件名后運行安裝,你可以在程序中加上判斷文件名更改的處理,給用戶提示。
總結
以上是生活随笔為你收集整理的[转]获取Setup文件的运行路径的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 屏蔽鼠标右键、Ctrl+N、Shift+
- 下一篇: 给自定义控件(Web Control)添