c# Process.Start()找不到系統(tǒng)文件的解決方法
問(wèn)題描述
vs1027在X64應(yīng)用程序下執(zhí)行process.start()
時(shí),OK;但是在X86應(yīng)用程序下執(zhí)行process.start()
,報(bào)錯(cuò):找不到系統(tǒng)文件
if (kbpr.HasExited) { kbpr = Process.Start(@"C:\Windows\System32\osk.exe"); }
網(wǎng)上搜索良久,發(fā)現(xiàn)原因?yàn)椋?strong>windows重定向搞得鬼
在64位的Windows操作系統(tǒng)中,為了兼容32位程序的運(yùn)行,64位的Windows操作系統(tǒng)采用重定向機(jī)制。目的是為了能讓32位程序在64位的操作系統(tǒng)不僅能操作關(guān)鍵文件文夾和關(guān)鍵的注冊(cè)表并且又要避免與64位程序沖突;因此,32位應(yīng)用程序的運(yùn)行是通過(guò)WOW64的模擬器來(lái)實(shí)現(xiàn)的。WOW64 是一個(gè)由操作系統(tǒng)提供的兼容性環(huán)境,它使得 32 位應(yīng)用程序能夠在 Windows 64 位操作系統(tǒng)上運(yùn)行,在系統(tǒng)的Windows目錄下,存在System32和SysWOW64兩個(gè)文件夾:
System32文件夾下存放的是64位DLL
SysWOW64文件夾下存放的是32位DLL
因此,如果我們用32位程序去訪問(wèn)c:\windows\system32,不管我們用硬編碼還是其它的方式,系統(tǒng)都會(huì)自動(dòng)地給我們轉(zhuǎn)向到C:\windows\syswow64下面。
禁止系統(tǒng)的重定向的解決辦法是調(diào)用下面的API函數(shù)
禁用系統(tǒng)重定向用下面的函數(shù): BOOL Wow64DisableWow64FsRedirection(PVOID OldValue); 恢復(fù)系統(tǒng)重定向用下面的函數(shù): BOOL Wow64RevertWow64FsRedirection(PVOID OldValue);
解決辦法
具體代碼如下:
// 關(guān)閉64位(文件系統(tǒng))的操作轉(zhuǎn)向 [DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr); // 開(kāi)啟64位(文件系統(tǒng))的操作轉(zhuǎn)向 [DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr); IntPtr oldWOW64State = new IntPtr(); Wow64DisableWow64FsRedirection(ref oldWOW64State); // 關(guān)閉64位(文件系統(tǒng))的操作轉(zhuǎn)向 Wow64RevertWow64FsRedirection(oldWOW64State); // 開(kāi)啟64位(文件系統(tǒng))的操作轉(zhuǎn)向
注1
網(wǎng)上還有中辦法,將路徑c:\windows\system32\
改為c:\windows\sysnative\
,但是我嘗試,好像不管用;可能是需要注冊(cè)表或者哪里設(shè)置過(guò)吧
注2
當(dāng)然最簡(jiǎn)單的辦法,是將應(yīng)用程序改為64位,就不存在以上問(wèn)題了。
【參考1】https://www.cnblogs.com/iamlucky/p/5998086.html
【參考2】https://www.bbsmax.com/A/mo5kj04KJw/
到此這篇關(guān)于c# Process.Start()找不到系統(tǒng)文件的解決方法的文章就介紹到這了,更多相關(guān)c# Process.Start()找不到系統(tǒng)文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#使用OpenCvSharp實(shí)現(xiàn)透視變換功能
這篇文章主要為大家詳細(xì)介紹了C#如何使用OpenCvSharp實(shí)現(xiàn)透視變換的功能,文中的示例代碼簡(jiǎn)潔易懂,具有一定的學(xué)習(xí)價(jià)值,需要的小伙伴可以參考下2023-11-11詳解Unity中的ShaderGraph入門(mén)使用教程
Unity2018版本之后推出了一個(gè)可編程渲染管線工具ShaderGraph,讓我們可以通過(guò)可視化界面拖拽來(lái)實(shí)現(xiàn)著色器的創(chuàng)建和編輯,今天重點(diǎn)給大家介紹Unity中的ShaderGraph入門(mén)使用教程,需要的朋友參考下吧2021-07-07C#實(shí)現(xiàn)六大設(shè)計(jì)原則之里氏替換原則
這篇文章介紹了C#實(shí)現(xiàn)六大設(shè)計(jì)原則之里氏替換原則的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02C#通過(guò)oledb訪問(wèn)access數(shù)據(jù)庫(kù)的方法
這篇文章主要介紹了C#通過(guò)oledb訪問(wèn)access數(shù)據(jù)庫(kù)的方法,實(shí)例分析了C#操作access數(shù)據(jù)庫(kù)的相關(guān)技巧,需要的朋友可以參考下2015-06-06C#實(shí)現(xiàn)讀取Word表格到DataSet
在應(yīng)用項(xiàng)目里,多數(shù)情況下我們會(huì)遇到導(dǎo)入 Excel 文件數(shù)據(jù)到數(shù)據(jù)庫(kù)的功能需求,但某些情況下,也存在使用 Word 進(jìn)行表格數(shù)據(jù)編輯的情況,這其中也包括導(dǎo)入Word內(nèi)容的功能,比如表格數(shù)據(jù)導(dǎo)出到DataSet數(shù)據(jù)集,本文將給大家介紹了C#讀取Word表格到DataSet2023-12-12C#實(shí)現(xiàn)員工ID卡的識(shí)別功能
這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)識(shí)別員工ID卡的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2023-01-01C#實(shí)現(xiàn)輸入10個(gè)數(shù)存入到數(shù)組中并求max和min及平均數(shù)的方法示例
這篇文章主要介紹了C#實(shí)現(xiàn)輸入10個(gè)數(shù)存入到數(shù)組中并求max和min及平均數(shù)的方法,涉及C#簡(jiǎn)單數(shù)據(jù)轉(zhuǎn)換與數(shù)值運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2017-07-07C#中OpenCVSharp實(shí)現(xiàn)輪廓檢測(cè)
這篇文章主要介紹了C#中OpenCVSharp實(shí)現(xiàn)輪廓檢測(cè),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11