[wine-zh] Re: [wine-zh] SHFileOperationW 的问题(about Bug 34324)

  • From: Zhenbo Li <litimetal@xxxxxxxxx>
  • To: Jactry Zeng <jactry92@xxxxxxxxx>
  • Date: Sat, 2 Nov 2013 18:48:13 +0800

在 2013年11月2日下午5:12,Jactry Zeng <jactry92@xxxxxxxxx>写道
>
>
> 很高兴你已经开始 hack 了~
> 我昨天做过一些测试,在 windows7 下,但是情况和你的看起来不太一样,我也还没彻底弄明白。
>
MSDN 提到  This function has been replaced in Windows Vista by
*IFileOperation*<http://msdn.microsoft.com/en-us/library/windows/desktop/bb775771%28v=vs.85%29.aspx>.

你在 win 7 下也可以正常使用 SHFileOperation 吗?

> 而且情况也比较复杂,从 MSDN 可以看出 SHFileOperation 支持一次传入多个 路径/文件 进行处理,以 “\0”
> 分割、”\0\0”结尾,所以就存在其中一些/个 路径/文件 不存在,另外一些/个存在的的情况。
>
你说的对,这种情况比较常见,我没有考虑过


> 以下是我的测试代码:
> <code>
> #include <stdio.h>
> #include <windows.h>
>
> int main()
> {
>     SHFILEOPSTRUCT FileOp;
>     ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT));
>     FileOp.fFlags = FOF_NOCONFIRMATION;
>     FileOp.hNameMappings = NULL;
>     FileOp.hwnd = NULL;
>     FileOp.lpszProgressTitle = NULL;
>     FileOp.pTo = NULL;
>     FileOp.wFunc = FO_DELETE;
>     FileOp.pFrom =  “1.txt\0t/\0\0";
>     printf("%d\n", SHFileOperation(&FileOp));
>     return 0;
> }
> </code>
> 这是在 win7 的一些结果:
> 1. touch 1.txt && mkdir t => 0
> 2. touch 1.txt => 124 and didn't remove 1.txt
> 3. mkdir t => 2 and didn't remove t
>
> 从这里还可以看出,ERROR_FILE_EXISTS 和 ERROR_PATH_NOT_FOUND 两种情况可能是
> 需要区别对待的。
> 我不知道是否是因为不同 windows 版本所以导致了结果不一样?
>
我认为是的。

> 所以还需要更多测试。
>
> 我建议 Zhenbo 可以不急着想怎么修这个 bug,而可以从给 shell32 添加 testcase 开始,
> 现在你已经能写出程序程序了,只要把这部分代码整理下,放进现有的 tests 中就 ok 了。
> 当然你需要把你能想到的情况都写成 testcase,尽可能覆盖。
> 然后 Wine 的 testbot 提供了多个 windows 版本,你也可以先把自己写的测试程序放到
> testbot 上跑下,看看不同 windows 版本处理的方式是不是一样。
>
> 恩,我正在看 testcase 的写法
但我有一个问题:在 testcase 里,应该怎么写,来保证去删除一个不存在的文件呢?


>  --
> Regards,
> Jactry Zeng
>



-- 
Have a nice day!
Zhenbo Li

Other related posts: