所以我用下面的代码来转储每个扩展文件属性来调试控制台...
ShellClass shellClass = new ShellClass();
Folder dir = shellClass.NameSpace(Path.GetDirectoryName(sFilePath));
FolderItem item = dir.ParseName(Path.GetFileName(sFilePath));
for (int i = 0; i < 267; i++)
{
System.Debug.WriteLine(dir.GetDetailsOf(item, i));
}
由于SHELL32是一个非托管库,我不能直接嵌入到程序中的DLL资源,它必须产生一个互操作助手DLL。
任何人都知道在SHELL32这些函数的dllimport的命令行来绕过整整一代人的互操作DLL的? 我检查pinvoke.net和SHELL32条目下,他们要么没有什么,我在寻找,或者它不叫什么,我很期待。
如果不是可以使用的DllImport做到这一点,没有人知道的方式使用托管DLL拉所有的扩展属性的有关文件,或至少一个办法做到这一点,我没有产生助手DLL并要求与我开发一个应用程序的安装?
多谢!
大多数的Windows Shell中的API功能具有的P / Invoke入口点返回COM接口,所以你应该很少需要显式创建ShellClass伴生类实例。 (您正在使用的对象Folder
和FolderItem
,大多是指供后期绑定客户,如脚本语言;用C#你可以做的更好。)
为了避免生成interop程序集,您只需要声明在C#代码相应类型匹配的P / Invoke功能和外壳已经实现了COM接口,它们。 在你的情况,你要找的是什么IShellFolder2
接口(这是基本相同的Folder
对象)。
通常情况下,做你的要求,你会:
- 呼叫
SHGetDesktopFolder
到返回IShellFolder
接口指向桌面文件夹。 - 调用
IShellFolder::ParseDisplayName
它给你一个“指针标识符列表”,代表该文件夹的内壳标识符(PIDL)所需的文件夹上。 - 投下你
IShellFolder
到IShellFolder2
(使用as
,像任何其他接口)。 - 呼叫
IShellFolder2::GetDetailsOf()
从第2步和你想要的列传递PIDL。
您将需要两个COM接口转换,再加上一个结构和一个P / Invoke函数,并把C#代码在您的项目。 你可以逃脱IntPtr
了很多这方面的(如PIDL),因为你只需要通过他们周围COM方法之间。 (MSDN文章会告诉你,你有责任在完成后释放内存; CLR的互操作代码会照顾这些东西你在几乎所有情况。)
pinvoke.net将帮助你在这里,也将这个让人着迷写得很好一系列博客文章做从MSDN文章COM互操作的翻译。
根据我的经验,使用托管代码的外壳API的最有效的方法是使用的Windows API代码包 。 这种包装了外壳API的所有有用的部分,并使其从平凡托管代码访问。 下载文件中包含大量的例子,让你在路上。