作者UNARYvvv (有趣生活)
看板C_and_CPP
標題Re: [問題] fopen回傳null該怎麼辦
時間Sun Jul 12 17:09:59 2009
※ 引述《QQ29 (我愛阿蓉)》之銘言:
: 大家好
: 是這樣的.... 我目前自己寫的程式 想到別台電腦上跑
: 因為不是什麼大程式 只不過讀寫檔案而已 自己的電腦跑是OK的不會出錯
: 丟到另一台舊電腦 也是可以跑沒有錯誤
: 問題就在我丟到另一台電腦 他卻會出現assertion fail ...
: fwrite.c
: Expression: (stream!=NULL)
: _VALIDATE_RETURN( (stream != NULL), EINVAL, -1);
: 是出現在下面這段
: FILE * pFile;
: pFile=fopen("C:\\test.bin","wb");
: fwrite(...,...,...,pFile);
: 我發現pFile得到fopen的return值後 會是null....
: 沒道理阿= =
: 我找不出錯誤 只能想說三台電腦平台上的差異 就是壞掉的這台是vista 32bit
: 可是為什麼會一直return null...
: 請問有人知道是什麼原因嘛?
: 謝謝
因為 Vista 上每個程式有所謂的 integrity level(IL)
平常直接執行一個程式時,預設 IL=Medium
以系統管理員身份執行時, IL=High (就是 UAC 視窗選取 "允許" 之後)
IL=Medium 時
程式不能寫入系統磁碟根目錄、還有一些系統資料夾如 Windows, Program Files
如果程式有啟動虛擬化,程式則會以為寫入是成功的
但實際上是被 OS 導向寫到別的位置去
(寫入根目錄的 case 例外,就算有虛擬化,fopen 還是會回傳失敗)
所以有在 Vista 上重新設計過的軟體安裝程式
為了要能正確寫入到 Program Files 資料夾,都會要求 IL=High
也就是跳 UAC 詢問是否允許
(也就是 Vista 使用者嫌煩的那個..做什麼都要跳出來問的視窗XD)
如果你是直接把測試程式 exe 拿去 Vista 上跑
就在檔案總管選那個 exe,按滑鼠右鍵選取「以系統管理員身份執行」
那個 C:\test.bin 應該就會成功建出來了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.126.2.150
推 zlw:記得連 sysinternal 的軟體開來看看,都覺得很麻煩 07/12 17:16
推 VictorTom:應該要推一下這篇:p 07/12 17:58
→ UNARYvvv:沒事我也不會開procexp了..XD有程式卡住就工作管理員關它 07/13 03:22