代码整合 From 《一场因为想偷懒引发的那些事——C#调用COM的一个进阶使用方式》

特别鸣谢 知乎 小鸣 emmmmmmm

整合的代码来源自:

一场因为想偷懒引发的那些事——COM的那些事1

一场因为想偷懒引发的那些事——COM的那些事2

一场因为想偷懒引发的那些事——WinDbg的简单用法

一场因为想偷懒引发的那些事——记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();
            }
        }
    }
}
 

附:代码工程文件:

       comBlackTech【C#操作COM组件的黑科技!】.zip      https://download.csdn.net/download/hardwork617s/89336051icon-default.png?t=N7T8https://download.csdn.net/download/hardwork617s/89336051

  • 17
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值