2011-03-17 34 views
6

试一试吧:CreateFile如何使用FILE_SHARE_READ失败并成功使用FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE?

创建一个XLS文件,在Excel中打开它。

打开sysinternals进程监视器,并观察当您在资源管理器中创建XLS文件副本时发生的情况(只需点击ctrl-c ctrl-v)。

连续拨打::CreateProcess的两个电话。第一个电话要求读取权限,并且拒绝Access。第二次调用请求读取加写入加上删除和传递。

这是正常的吗?

回答

11

如果您使用FILE_SHARE_READ打开文件,则表示您愿意共享此文件的访问权限,但仅限于读取。

如果你打开所有的标志,你愿意共享访问也写/删除。

FILE_SHARE_READFILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE

更具限制性如果某些其它过程(EXCEL)具有该文件打开例如写入(并且设置了共享标志),您可以访问它的唯一方法是接受共享以进行写入。

3

您必须使用兼容的共享模式。如果Excel使用FILE_SHARE_READ |打开文件FILE_SHARE_WRITE然后后续尝试打开文件必须至少使用相同的标志。具体来自MSDN documentation on CreateFile

您无法请求与具有打开句柄的现有请求中指定的访问模式冲突的共享模式。 CreateFile将失败,GetLastError函数将返回ERROR_SHARING_VIOLATION。

相关问题