起因
看来人总是健忘的,只能隐约的记得是因为一个关于C#封装的COM接口的问题。于是自己动手封装实现了一下,接着就引发了下面一系列的问题。
一场因为想偷懒引发的那些事——COM的那些事1
一场因为想偷懒引发的那些事——COM的那些事2
一场因为想偷懒引发的那些事——WinDbg的简单用法
一场因为想偷懒引发的那些事——记C# Com接口调用的相关姿势
一场因为想偷懒引发的那些事——C#调用COM的一个进阶使用方式
一场因为想偷懒引发的那些事番外——结构体的一些事
Introduction
在Windows 中想对Shell做一些操作的话,肯定是绕不开COM的,比如:获取资源管理器
中某个文件的邮件菜单、对某个文件的右键菜单进行扩充等。
既然这样就绕不开通过C# 对COM对象的一些调用了,首先,用之前说过的一个Win32 API来举例:
[DllImport("Shell32.dll")]
public extern static int SHCreateItemFromParsingName([In][MarshalAs(UnmanagedType.LPWStr)] string pszPath, [In] IntPtr pbc,
[In][MarshalAs(UnmanagedType.LPStruct)] Guid riid, out IntPtr ppv);
该接口的详细定义可以参考MSDN: SHCreateItemFromParsingName 。
简单的来说,调用此API,传入一个文件的名字,返回一个Shell object,没错 返回的就是一个指向IShellItem
或IShellItem2
这个COM 接口的指针。
相关IShellItem
的封装在最后部分。
例如通过调用GetDisplayName,获得文件特定格式的名字,C# 中的调用就可以这么写:
var result = SHCreateItemFromParsingName(@"D:\bios.bin", IntPtr.Zero, IID_IShellItem, out IntPtr si);
var shell=(IShellItem)Marshal