日期:2014-05-17  浏览次数:21138 次

C#做一个IE按钮的Dll COM组件,点击弹出"HelloWorld"窗口——COM调用无效,求指点
本帖最后由 foxfire882 于 2012-02-22 19:39:35 编辑 用C#实现一个简单的IE插件:
需求1、在IE工具栏上增加一个按钮
需求2、点击这个按钮弹出"HelloWorld"
================================================================================
很简单的需求吧?死活搞不定。。。。

需求1很容易实现,在注册表中增加相关键值就可以了,这个很容易不多说了。

关键在于需求2,根据MSDN描述需要这个Dll COM实现IOleCommandTarget接口,这个接口有两个方法:QueryStatus()和Exec(),当点击按钮时会触发IOleCommandTarget.Exec()这个方法。

但是我实际操作后编译通过dll注册也成功,注册表键值也都设置了,但就是点击按钮时无效,"HelloWorld"没有弹出来。

求高人指点....


以下是相关代码:

//IOleCommandTarget.cs接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace BHO
{
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
    public struct OLECMDTEXT
    {
        public uint cmdtextf;
        public uint cwActual;
        public uint cwBuf;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 100)]
        public char rgwz;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct OLECMD
    {
        public uint cmdID;
        public uint cmdf;
    }

    [ComImport,Guid("b722bccb-4e68-101b-a2bc-00aa00404770"),InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]

    public interface IOleCommandTarget
    {
        void QueryStatus(ref Guid pguidCmdGroup, UInt32 cCmds, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] OLECMD[] prgCmds, ref OLECMDTEXT CmdText);
        void Exec(ref Guid pguidCmdGroup, uint nCmdId, uint nCmdExecOpt, ref object pvaIn, ref object pvaOut);
    }
}






 public class HelloWorld : IOleCommandTarget
    {

        public void QueryStatus(ref Guid pguidCmdGroup, UInt32 cCmds, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] OLECMD[] prgCmds, ref OLECMDTEXT CmdText)
        {
            MessageBox.Show("QueryStatus");
        }

        public void Exec(ref Guid pguidCmdGroup, uint nCmdId, uint nCmdExecOpt, ref object pvaIn, ref object pvaOut)
        {
            MessageBox.Show("HelloWorld");
        }
      ......
      ......//其