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");
}
......
......//其