特别鸣谢 知乎 小鸣 emmmmmmm
整合的代码来源自:
一场因为想偷懒引发的那些事——记C# Com接口调用的相关姿势
一场因为想偷懒引发的那些事——C#调用COM的一个进阶使用方式
代码 is everything !
整合后的代码见下面:
#region @‘小鸣’知乎博主: 您不是程序员,您是黑.客.!!!
/* 来源:《一场因为想偷懒引发的那些事——C#调用COM的一个进阶使用方式》
* 说明:将该博主帖子上的有关代码进行整合,使用 VS2022 + .Net6.0 编译通过。
* 心得:‘小鸣’知乎博主,不是程序员,是 黑.客.!!!
*/
#endregion
using System;
using System.Runtime.InteropServices;
namespace autoCOM
{
class Test
{
public enum SIGDN
{
SIGDN_NORMALDISPLAY = 0x00000000,
SIGDN_PARENTRELATIVEPARSING = unchecked((int)0x80018001),
SIGDN_DESKTOPABSOLUTEPARSING = unchecked((int)0x80028000),
SIGDN_PARENTRELATIVEEDITING = unchecked((int)0x80031001),
SIGDN_DESKTOPABSOLUTEEDITING = unchecked((int)0x8004c000),
SIGDN_FILESYSPATH = unchecked((int)0x80058000),
SIGDN_URL = unchecked((int)0x80068000),
SIGDN_PARENTRELATIVEFORADDRESSBAR = unchecked((int)0x8007c001),
SIGDN_PARENTRELATIVE = unchecked((int)0x80080001),
SIGDN_PARENTRELATIVEFORUI = unchecked((int)0x80094001)
}
[ComImport]
[Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IShellItem
{
[PreserveSig]
void BindToHandler(IntPtr pbc,
[MarshalAs(UnmanagedType.LPStruct)] Guid bhid,
[MarshalAs(UnmanagedType.LPStruct)] Guid riid,
out IntPtr ppv);
[PreserveSig]
uint GetParent(out IShellItem ppsi);
[PreserveSig]
uint GetDisplayName(SIGDN sigdnName, [MarshalAs(UnmanagedType.LPWStr)] out string ppszName);
[PreserveSig]
uint GetAttributes(uint sfgaoMask, out uint psfgaoAttribs);
[PreserveSig]
uint Compare(IShellItem psi, uint hint, out int piOrder);
}
[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);
private static void Main()
{
unsafe
{
Guid IID_IShellItem = new Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe");
string strFileFullPath = @"C:\Program Files (x86)\SogouInput\14.4.0.9382\sgim_gd_py_ext.bin";
var result = SHCreateItemFromParsingName(strFileFullPath, IntPtr.Zero, IID_IShellItem, out IntPtr si);
//var result = SHCreateItemFromParsingName(@"F:\setup.bin", IntPtr.Zero, IID_IShellItem, out IntPtr si);
long* address = (long*)*((long*)si.ToPointer());
delegate* unmanaged<IntPtr, int, IntPtr*, uint> p = (delegate* unmanaged<IntPtr, int, IntPtr*, uint>)address[5];
IntPtr str = IntPtr.Zero;
var result12 = p(si, 0, &str);
string content = Marshal.PtrToStringAuto(str);
Console.WriteLine($"content: {content}");
Console.ReadKey();
}
}
}
}
附:代码工程文件: