在深入探讨这一点之前,我将为您提供我想做的概述。因为我不知道使用Windows Filesystem属性是否是正确的选择。

我在系统中有两个组件。其中一个是ShellExtension,它在满足某些条件时放置OverlayIcon,另一个组件是Filesystem驱动程序,该驱动程序向Windows提供信息(因此向ShellExtension提供信息)

FileSystem使用文件名向远程服务器发出网络请求,并且根据该请求的结果,是否应该显示覆盖图标。

直接的解决方案是从OverlayIcon端重复请求,但这不是理想的。在FileSystem端,我有请求结果,但是我需要将其发送到Overlay。

我想到的第一个解决方案是使用Windows FileSystem属性。我的意思是,在文件系统驱动程序中,我将放置一个尚未使用的attrubute(例如,根据MSDN似乎未使用的0x1000000),并在OverlayIcon中恢复此信息,因为资源管理器会将Shell发送给Shell Extension。文件属性作为“ IsMemberOf”的参数。也就是说,使用Windows File Attributes将信息从FileSystem端编码到ShellExtension之一。

该解决方案不起作用,似乎在流程的某些部分中,此属性已删除。这是有道理的,因为此属性似乎无效。如果我将属性值替换为HIDDEN之类的值,则效果很好。

显而易见的解决方案(但它还有很多工作要做)是使用某些IPC机制。

但是正如我在游戏的两面一样,如果我可以使用Windows Filesystem信息,那就更好了。

你有什么建议?

谢谢!

最佳答案

为什么这么复杂?有一个适当的接口。调用GetFileInformationByHandleEx(FileRemoteProtocolInfo)以获得FILE_REMOTE_PROTOCOL_INFO。将特定于协议的数据放入ProtocolSpecificReserved。那是64字节大。

您当前想法最可行的替代方法是使用FILE_ATTRIBUTE_REPARSE_POINT。如果使用此选项,则可以在WIN32_FIND_DATA::dwReserved0中放置标签。这不会与其他标签冲突,因为这些标签是Microsoft分配的。

http://msdn.microsoft.com/en-us/library/aa365511(VS.85).aspx

还有更多地方可以散乱数据。您可能会考虑使用创建文件时间的最低位。您真的需要100 ns的分辨率,还是200 ns足够好?您能以某种方式将其存储在BY_HANDLE_FILE_INFORMATION::nFileIndexHigh吗?

关于c++ - 通过Windows FileSystem属性发送自定义信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2274181/

10-11 22:06
查看更多