一场因为想偷懒引发的那些事——记C# Com接口调用的相关姿势

本文讲述了作者在C#中封装并调用COM接口时遇到的问题及解决过程,包括错误原因分析和WinDbg的简单应用。通过示例展示了直接调用COM方法可能产生的错误,如函数入口地址计算错误,以及如何通过正确使用特性避免此类问题。文章以一场想偷懒的尝试为线索,探讨了COM Interop的深入用法。
摘要由CSDN通过智能技术生成

起因

看来人总是健忘的,只能隐约的记得是因为一个关于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,没错 返回的就是一个指向IShellItemIShellItem2 这个COM 接口的指针。

相关IShellItem的封装在最后部分。

例如通过调用GetDisplayName,获得文件特定格式的名字,C# 中的调用就可以这么写:

    var result = SHCreateItemFromParsingName(@"D:\bios.bin", IntPtr.Zero, IID_IShellItem, out IntPtr si);
    var shell=(IShellItem)Marshal
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值