因此,我使用以下代码将每个扩展文件属性转储到调试控制台...
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并需要安装程序来安装我正在开发的应用程序?
非常感谢!
发布于 2012-05-01 05:17:37
大多数Windows Shell API功能都有返回COM接口的P/Invoke入口点,因此您很少需要显式创建一个ShellClass CoClass实例。(您正在使用的对象Folder和FolderItem主要供后期绑定客户端使用,比如脚本语言;使用C#可以做得更好。)
为了避免生成互操作程序集,您只需在C#代码中声明与外壳程序已经实现的P/Invoke函数和COM接口相匹配的适当类型。在本例中,您要寻找的是IShellFolder2接口(它本质上与Folder对象相同)。
通常,要做你所要求的事情,你需要:
SHGetDesktopFolder以返回指向桌面文件夹的IShellFolder接口。IShellFolder::ParseDisplayName,这将为您提供一个表示该文件夹内部外壳的指针( PIDL),并将您的IShellFolder传递到IShellFolder2 (使用D15和任何其他PIDL一样,传递步骤2中的PIDL和所需的列。H219G220您需要转换两个COM接口,以及一个结构和一个P/Invoke函数,并将C#代码放入您的项目中。你可以使用IntPtr来做很多事情(比如PIDL),因为你只需要在COM方法之间传递它们。( MSDN文章将告诉您,在完成操作后,您将负责释放内存;CLR的互操作代码将在几乎所有情况下为您处理这些问题。)
pinvoke.net将在这里为您提供帮助,就像这篇来自MSDN文章中关于COM互操作转换的编写得非常好的series of blog posts一样。
发布于 2012-05-02 08:29:52
根据我的经验,从托管代码使用shell API的最有效方法是使用Windows API Code Pack。这包装了shell API的所有有用部分,并使其可以很容易地从托管代码访问。下载中包含了许多示例,可以帮助您上路。
https://stackoverflow.com/questions/10390260
复制相似问题