PreviewHandler用法(三)

    四.C#如何与COM进行交互

    由于IPreviewHandlerCOM接口,要想在C#中用,那么就要把它导入到C#中来,用[ComImport]标记可以将COM接口导入到C#中。ComImport的含义是指示该属性化类型是以前在COM 中定义的。在接口导入后,要对接口里的函数进行定义,不然C#中的程序就用不了。代码如下:

[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("8895b1c6-b41f-4c1c-a562-0d564250836f")]
interface IPreviewHandler
{
    void SetWindow(IntPtr hwnd, ref RECT rect);
    void SetRect(ref RECT rect);
    void DoPreview();
    void Unload();
    void SetFocus();
    void QueryFocus(out IntPtr phwnd);
    [PreserveSig]
    uint TranslateAccelerator(ref MSG pmsg);
}
 
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("b7d14566-0509-4cce-a71f-0a554233bd9b")]
interface IInitializeWithFile
{
    void Initialize([MarshalAs(UnmanagedType.LPWStr)] string pszFilePath, uint grfMode);
}
 
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("b824b49d-22ac-4161-ac8a-9916e8fa3f7f")]
interface IInitializeWithStream
{
    void Initialize(IStream pstream, uint grfMode);
}


[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
    public int left;public int top;
    public int right;
    public int bottom;
    public RECT(Rect rect)
    {
        this.top = (int)rect.Top;
        this.bottom = (int)rect.Bottom;
        this.left = (int)rect.Left;
        this.right = (int)rect.Right;
    }
} 

    关于COM接口函数参数类型在C#中对应类型是什么的问题,据我所知,没有那么一个对应表,我觉得这就看你的经验了,其实做多了,也就知道。比如说:

       HANDLE –> IntPtr

       IN LPCTSTR pszBuffer –> String

       OUT LPTSTR pszBuffer –> ref StringBuilder,而不是String, C++中遇到这种类型的参数,一般是传一个数组BUFFER的地址,让函数给这个BUFFER填充值,所以在这里对应的C#类型就应该为StringBuilder,而不是String,因为尽管String是引用类型,但做参数时是当值类型的。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值