作者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
1F:推 zlw:记得连 sysinternal 的软体开来看看,都觉得很麻烦 07/12 17:16
2F:推 VictorTom:应该要推一下这篇:p 07/12 17:58
3F:→ UNARYvvv:没事我也不会开procexp了..XD有程式卡住就工作管理员关它 07/13 03:22