33、使用 Band 对象扩展浏览器框架

使用 Band 对象扩展浏览器框架

1. BandObject 类与 IDockingWindow 接口

BandObject 类的用户界面(.NET UserControl 的实现)会被放置并停靠到 IE 站点。为了响应窗口位置和停靠的变化,该类实现了 IDockingWindow 接口。此接口定义了一些函数,当重要的停靠窗口事件发生时,这些函数会被调用。以下是 IDockingWindow 接口的实现代码:

#region IDockingWindow Interface Implementation

public void CloseDW(uint dwReserved)
{
    // Dispose of the current object
    Dispose(true);
}

public void ResizeBorderDW(IntPtr prcBorder, object punkToolbarSite, bool fReserved)
{
    // Perform no action and return
    return;
}

public void ShowDW(bool bShow)
{
    // If bShow is true, show the user control; otherwise hide it
    if (bShow) Show();
    else Hide();
}

#endregion IDockingWindow Interface Implementation
  • CloseDW 函数 :用于通知停靠窗口即将关闭。在很多应用中,这个调用可以作为在退出前持久化信息的机会。这里用于以正确的方式处理托管对象。
  • ResizeBorderDW 函数 :通知停靠窗口发生了大小调整事件,但在这个实现中,BandObject 类不执行任何特殊操作。
  • ShowDW 函数 :用于通知停靠窗口的可见状态,根据传入的布尔值决定是否显示。
2. 注册 Band 对象

实现了 Band 对象后,必须将其同时注册到 COM 和 IE 中,才能在浏览器中加载。以下是 COM 注册方法:

#region COM Registration Methods

[ComRegisterFunction]
public static void Register(Type t) { ... }

[ComUnregisterFunction]
public static void Unregister() { ... }

#endregion COM Registration Methods

注册过程会获取从 BandObject 基类派生的扩展定义的元数据,并将其注册到 COM 和 IE 中。这些数据通过调用超类实现的 DefineMetadata() 方法获取。以下是注册函数的定义:

[ComRegisterFunction]
public static void Register(Type t)
{
    // Call the define metadata function for the class instance
    // implementing this base class
    ((BandObject)Activator.CreateInstance(t)).DefineMetadata();

    try
    {
        // Open the HKEY_CLASSES_ROOT\CLSID key and create the subkey
        // for the extension's GUID
        RegistryKey classIdKey = Registry.ClassesRoot.CreateSubKey(@"CLSID\" + ClassId);
        {
            // Set the default value to be the object name
            classIdKey.SetValue(String.Empty, ObjectName);

            // Set the menu text to be the object name
            classIdKey.SetValue("MenuText", ObjectName);

            // Set the help text to the help text value
            classIdKey.SetValue("HelpText", HelpText);

            ...

注册完成后,会向 HKEY_CLASSES_ROOT(用于 COM 注册)和 HKEY_LOCAL_MACHINE 或 HKEY_CURRENT_USER 中的 IE 键(用于 IE 注册)写入一些注册表项。以下是一个示例注册表项:

HKEY_CLASSES_ROOT\
   CLSID\
      {0A7D6D96-7822-4389-B07E-494E5E25A83A}\
         (Default)  = "TodoBar" (REG_SZ)
         HelpText   = "Example Toolbar for IE" (REG_SZ)
         MenuText   = "TodoBar" (REG_SZ)
         Implemented Categories\
            {62C8FE65-4EBB-45e7-B440-6E39B2CDBF29}\
         InprocServer32\
            (Default)       = "mscoree.dll" (REG_SZ)
            Assembly        = "Toolbar, Version=1.0.0.0..." (REG_SZ)
            Class           = "ProIeDev.BandObjectDemo.Toolbar.Toolbar" (REG_SZ)
            CodeBase        = "file:///..." (REG_SZ)
            RuntimeVersion  = "v2.0.50727" (REG_SZ)
            ThreadingModel  = "Apartment" (REG_SZ)
            1.0.0.0\
               Assembly        = "Toolbar, Version=1.0.0.0..." (REG_SZ)
               Class           = "ProIeDev.BandObjectDemo.Toolbar.Toolbar" (REG_SZ)
               CodeBase        = "file:///..." (REG_SZ)
               RuntimeVersion  = "v2.0.50727" (REG_SZ)
         Instance\
            CLSID  = "{E31EAE3B-65E1-4D56-A3D0-9E653D978A9A}" (REG_SZ)
            InitPropertyBag\
               Url  = "" (REG_SZ)
         ProgId\
            (Default)  = "ProIeDev.BandObjectDemo.Toolbar" (REG_SZ)
  • GUID :扩展的 GUID 作为 HKEY_CLASSES_ROOT\CLSID 下的一个键添加。
  • 名称和文本 :名称、帮助菜单文本和扩展菜单项文本作为字符串值添加到该键中。
  • Implemented Categories 键 :用于告诉 Windows 这是什么类型的对象。所有 Band 对象都注册为实现一个公共类别,垂直和水平资源管理器栏还会注册一个额外的类别。
  • InprocServer32 键 :包含关于扩展的各种数据,如控件、入口点、线程样式、所需库等。
  • Instance 键 :定义实例的初始属性。
  • ProgId 键 :定义该扩展的 ProgId,供其他 COM 对象访问。
3. 不同类型的注册
  • 工具栏注册 :工具栏必须向 IE 注册才能在浏览器中加载并向用户展示。以下是一个工具栏注册的示例:
HKEY_LOCAL_MACHINE\
   Software\
      Microsoft\
         Internet Explorer\
            Toolbar\
               {0A7D6D96-7822-4389-B07E-494E5E25A83A}  = "TodoBar" (REG_SZ)

这些值只能放在 HKEY_LOCAL_MACHINE 中,作为 Software\Microsoft\Internet Explorer\Toolbar 子键下的字符串值。
- 资源管理器栏注册 :资源管理器栏必须通过 IE 资源管理器栏注册表项向 IE 展示。值可以放在 HKEY_LOCAL_MACHINE 或 HKEY_CURRENT_USER 中,单个扩展定义为以其 GUID 为名称的键,放在 Software\Microsoft\Internet Explorer\Explorer Bars 子键下。以下是一个示例:

HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER\
   Software\
      Microsoft\
         Internet Explorer\
            Explorer Bars\
               {FBAC3BF8-5210-4B61-879D-715396839846}\
                  BarSize  = 00 00 00 00 (REG_BINARY)

BarSize 是一个可选的二进制值,用于指示首次显示资源管理器栏时应使用的默认宽度(垂直资源管理器栏)或高度(水平资源管理器栏),用于持久化用户的自定义设置。

4. 注销函数

注销函数用于删除注册函数创建的注册表项:

[ComUnregisterFunction]
public static void Unregister()
{
    try
    {
        // Access the CLSID key in the registry
        RegistryKey clsidKey = Registry.ClassesRoot.OpenSubKey("CLSID", true);
        {
            // Delete the subkey containing the ClassID if possible
            clsidKey.DeleteSubKey(ClassId);
        }

    }
    catch (Exception) { }
}

该函数不会删除在 IE 注册表节点中创建的值,因为一旦 COM 对象条目被删除,IE 就不再认为该扩展有效。

5. 构建不同类型的扩展
  • 构建工具栏 :可以通过一个新的 .NET 项目创建工具栏扩展,该项目包含一个以 BandObject 库为基类的类。首先定义一个实现 BandObject 并实现虚函数 DefineMetadata() 的类:
[ComVisible(true)]
public class Toolbar : BandObject.BandObject
{
    public Toolbar() ...

    public override void DefineMetadata() ...

    #region Form Designer ...

}

以下是 DefineMetadata() 函数的实现:

public override void DefineMetadata()
{
    ClassId = "{0A7D6D96-7822-4389-B07E-494E5E25A83A}";
    ProgId = "ProIeDev.BandObjectDemo.Toolbar";

    ObjectName = "TodoBar";
    ObjectTitle = "TodoBar";
    HelpText = "Example Toolbar for IE.";

    InitialSize = new System.Drawing.Size(500, 30);
    IntegralSize = new System.Drawing.Size(0, 0);
    MinSize = new System.Drawing.Size(500, 30);
    MaxSize = new System.Drawing.Size(500, 500);

    Style = BandObjectTypes.Toolbar;
}

最后,将 UI 元素添加到用户控件中:

#region Form Designer

private System.Windows.Forms.Label TodoLabel;
private System.Windows.Forms.Button GoButton;
private System.Windows.Forms.TextBox TodoTextBox;

private void InitializeComponent()
{
    this.TodoLabel = new System.Windows.Forms.Label();
    this.TodoTextBox = new System.Windows.Forms.TextBox();
    this.GoButton = new System.Windows.Forms.Button();
    this.SuspendLayout();
    ...

注册该控件后,会将扩展添加到 Windows 注册表中作为新的 COM 对象,并向 IE 注册。

  • 构建垂直资源管理器栏 :同样可以通过新的 .NET 项目创建垂直资源管理器栏扩展。定义一个实现 BandObject 并实现 DefineMetadata() 函数的类:
[ComVisible(true)]
public class VerticalExplorerBar : BandObject.BandObject
{
    public VerticalExplorerBar () ...

    public override void DefineMetadata() ...

    #region Form Designer ...

}

DefineMetadata() 函数的实现如下:

public override void DefineMetadata()
{
    ClassId = "{FBAC3BF8-5210-4B61-879D-715396839846}";
    ProgId = "ProIeDev.BandObjectDemo.VerticalExplorerBar";
    ObjectName = "TodoBar Vertical";
    ObjectTitle = "TodoBar Vertical";
    HelpText = "TodoBar Vertical";
    Style = BandObjectTypes.VerticalExplorerBar;
}

添加 UI 元素:

#region Form Designer
private System.Windows.Forms.TextBox TodoTextbox;
private System.Windows.Forms.Label TodoLabel;
private System.Windows.Forms.Button GoButton; 

private void InitializeComponent()
{ 
    this.TodoTextbox = new System.Windows.Forms.TextBox(); 
    this.TodoLabel = new System.Windows.Forms.Label(); 
    this.GoButton = new System.Windows.Forms.Button(); 
    this.SuspendLayout(); 
    ... 

注册后,垂直资源管理器栏会被添加到 IE 中。

  • 构建水平资源管理器栏 :创建水平资源管理器栏扩展的步骤与上述类似。定义类:
[ComVisible(true)]
public class HorizontalExplorerBar : BandObject.BandObject
{
    public HorizontalExplorerBar () ...

    public override void DefineMetadata() ...

    #region Form Designer ...

}

DefineMetadata() 函数:

public override void DefineMetadata()  
{
    ClassId = "{B028EA5C-B226-4E4B-88C6-8842A152BC5B}";
    ProgId = "ProIeDev.BandObjectDemo.HorizontalExplorerBar";
    ObjectName = "TodoBar Horizontal";
    ObjectTitle = "TodoBar Horizontal";
    HelpText = "TodoBar Horizontal";
    Style = BandObjectTypes.HorizontalExplorerBar;
}

添加 UI 元素:

#region Form Designer

private System.Windows.Forms.Label TodoLabel;
private System.Windows.Forms.TextBox TodoTextbox;
private System.Windows.Forms.Button GoButton;

private void InitializeComponent()
{
    this.GoButton = new System.Windows.Forms.Button();
    this.TodoLabel = new System.Windows.Forms.Label();
    this.TodoTextbox = new System.Windows.Forms.TextBox();
    this.SuspendLayout();
    ...

注册后,水平资源管理器栏会在 IE 中显示。

下面是一个简单的 mermaid 流程图,展示了创建扩展的基本流程:

graph LR
    A[创建 .NET 项目] --> B[定义实现 BandObject 的类]
    B --> C[实现 DefineMetadata() 函数]
    C --> D[添加 UI 元素]
    D --> E[注册到 COM 和 IE]

通过以上步骤,我们可以使用 Band 对象扩展浏览器框架,创建各种类型的扩展。

使用 Band 对象扩展浏览器框架

6. 不同类型扩展的注册对比

为了更清晰地了解不同类型扩展(工具栏、垂直资源管理器栏、水平资源管理器栏)的注册差异,我们可以通过以下表格进行对比:
| 扩展类型 | COM 注册关键信息 | IE 注册位置 | 特殊注册项 |
| ---- | ---- | ---- | ---- |
| 工具栏 | 扩展 GUID 作为 HKEY_CLASSES_ROOT\CLSID 下的键,包含名称、文本、实现类别、InprocServer32 等信息 | HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar | 无 |
| 垂直资源管理器栏 | 同工具栏,额外实现一个类别 {00021493 - 0000 - 0000 - C000 - 000000000046} | HKEY_LOCAL_MACHINE 或 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Explorer Bars | BarSize(可选,用于定义默认宽度) |
| 水平资源管理器栏 | 同工具栏,额外实现一个类别 {00021493 - 0000 - 0000 - C000 - 000000000046} | HKEY_LOCAL_MACHINE 或 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Explorer Bars | BarSize(可选,用于定义默认高度) |

7. 实现细节分析
  • IDockingWindow 接口函数作用

    • CloseDW 函数:主要用于在窗口关闭前进行资源释放,如代码中调用 Dispose(true) 来正确处理托管对象。这对于一些需要在关闭时保存数据或清理资源的应用非常重要。
    • ResizeBorderDW 函数:在当前实现中,该函数不执行任何操作。但在实际应用中,如果需要对窗口大小调整事件做出响应,如重新布局 UI 元素,就可以在这个函数中添加相应的代码。
    • ShowDW 函数:根据传入的布尔值决定是否显示用户控件,实现了窗口的显示和隐藏功能。
  • 注册过程分析

    • COM 注册 :通过 [ComRegisterFunction] 标记的 Register 函数,首先调用 DefineMetadata 函数获取扩展的元数据,然后将这些数据写入 HKEY_CLASSES_ROOT\CLSID 下的相应键中。这些数据包括扩展的名称、文本、实现类别、InprocServer32 等信息,为 COM 系统识别和加载扩展提供了必要的信息。
    • IE 注册 :不同类型的扩展在 IE 中的注册位置不同。工具栏只能在 HKEY_LOCAL_MACHINE 中注册,而资源管理器栏可以在 HKEY_LOCAL_MACHINE 或 HKEY_CURRENT_USER 中注册。注册信息主要是扩展的 GUID 和名称,用于 IE 识别和加载扩展。
8. 注意事项
  • 注销操作 :在注销扩展时,虽然 Unregister 函数只删除了 HKEY_CLASSES_ROOT\CLSID 下的键,但实际上也会导致 IE 不再识别该扩展。不过,为了避免 IE 在加载时浪费时间查找不存在的扩展,建议在注销时也清理 IE 注册表节点中的相关信息。
  • 资源管理器栏的 BarSize :BarSize 是一个可选的二进制值,用于定义资源管理器栏的默认宽度或高度。在实际应用中,可以根据用户的需求设置这个值,以提供更好的用户体验。
9. 总结与展望

通过使用 Band 对象,我们可以方便地扩展浏览器框架,创建各种类型的扩展,如工具栏、垂直资源管理器栏和水平资源管理器栏。整个过程包括定义类、实现元数据函数、添加 UI 元素和进行注册等步骤。

在未来的开发中,我们可以进一步优化扩展的功能,例如添加更多的交互性、支持更多的自定义设置等。同时,也可以考虑将这些扩展应用到其他浏览器中,以扩大其使用范围。

下面是一个 mermaid 流程图,展示了注册和注销扩展的完整流程:

graph LR
    A[创建扩展类] --> B[实现 DefineMetadata 函数]
    B --> C[添加 UI 元素]
    C --> D[COM 注册]
    D --> E[IE 注册]
    E --> F[扩展可用]
    F --> G[使用扩展]
    G --> H[注销扩展]
    H --> I[删除 COM 注册信息]
    I --> J[可选:删除 IE 注册信息]

通过以上的介绍和分析,相信大家对使用 Band 对象扩展浏览器框架有了更深入的了解。希望这些内容能帮助大家在实际开发中顺利创建出各种实用的浏览器扩展。

【博士论文复现】【阻抗建模、验证扫频法】光伏并网逆变器扫频与稳定性分析(包含锁相环电流环)(Simulink仿真实现)内容概要:本文档是一份关于“光伏并网逆变器扫频与稳定性分析”的Simulink仿真实现资源,重点复现博士论文中的阻抗建模与扫频法验证过程,涵盖锁相环和电流环等关键控制环节。通过构建详细的逆变器模型,采用小信号扰动方法进行频域扫描,获取系统输出阻抗特性,并结合奈奎斯特稳定判据分析并网系统的稳定性,帮助深入理解光伏发电系统在弱电网条件下的动态行为与失稳机理。; 适合人群:具备电力电子、自动控制理论基础,熟悉Simulink仿真环境,从事新能源发电、微电网或电力系统稳定性研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握光伏并网逆变器的阻抗建模方法;②学习基于扫频法的系统稳定性分析流程;③复现高水平学术论文中的关键技术环节,支撑科研项目或学位论文工作;④为实际工程中并网逆变器的稳定性问题提供仿真分析手段。; 阅读建议:建议读者结合相关理论教材与原始论文,逐步运行并调试提供的Simulink模型,重点关注锁相环与电流控制器参数对系统阻抗特性的影响,通过改变电网强度等条件观察系统稳定性变化,深化对阻抗分析法的理解与应用能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值