P /与SHELL32调用,旁路Interop.Shell32.dll代(P/Invoke with

2019-07-29 05:24发布

所以我用下面的代码来转储每个扩展文件属性来调试控制台...

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并要​​求与我开发一个应用程序的安装?

多谢!

Answer 1:

大多数的Windows Shell中的API功能具有的P / Invoke入口点返回COM接口,所以你应该很少需要显式创建ShellClass伴生类实例。 (您正在使用的对象FolderFolderItem ,大多是指供后期绑定客户,如脚本语言;用C#你可以做的更好。)

为了避免生成interop程序集,您只需要声明在C#代码相应类型匹配的P / Invoke功能和外壳已经实现了COM接口,它们。 在你的情况,你要找的是什么IShellFolder2接口(这是基本相同的Folder对象)。

通常情况下,做你的要求,你会:

  1. 呼叫SHGetDesktopFolder到返回IShellFolder接口指向桌面文件夹。
  2. 调用IShellFolder::ParseDisplayName它给你一个“指针标识符列表”,代表该文件夹的内壳标识符(PIDL)所需的文件夹上。
  3. 投下你IShellFolderIShellFolder2 (使用as ,像任何其他接口)。
  4. 呼叫IShellFolder2::GetDetailsOf()从第2步和你想要的列传递PIDL。

您将需要两个COM接口转换,再加上一个结构和一个P / Invoke函数,并把C#代码在您的项目。 你可以逃脱IntPtr了很多这方面的(如PIDL),因为你只需要通过他们周围COM方法之间。 (MSDN文章会告诉你,你有责任在完成后释放内存; CLR的互操作代码会照顾这些东西你在几乎所有情况。)

pinvoke.net将帮助你在这里,也将这个让人着迷写得很好一系列博客文章做从MSDN文章COM互操作的翻译。



Answer 2:

根据我的经验,使用托管代码的外壳API的最有效的方法是使用的Windows API代码包 。 这种包装了外壳API的所有有用的部分,并使其从平凡托管代码访问。 下载文件中包含大量的例子,让你在路上。



文章来源: P/Invoke with Shell32, bypass Interop.Shell32.dll generation