代码之家  ›  专栏  ›  技术社区  ›  joshk0

为IE编写一个简单的ActiveX控件

  •  5
  • joshk0  · 技术社区  · 15 年前

    我正在学习如何编写可编写脚本的ActiveX控件。我的目标是要有一个微小的控制,可以检查,看看是否有东西安装在系统上。到目前为止我所做的是:

    • 在VS2008中创建MFC ActiveX控件项目
    • here .
    • 扩展IDL以提供我的“IsInstalled”方法,该方法目前无条件返回TRUE(但稍后将从注册表中读取一些键)
    • 构建控件并在其上运行regsvr32。我验证了它确实显示在HKEY\U CLASSES\u ROOT中,当我实例化这个对象时,IE开发者工具的“Locals”窗格显示这个对象的类型是\u D[我的插件名]。不仅如此,我的IsInstalled()方法也显示在该对象下面。

    但是,当我调用IsInstalled()时,我就是无法让它工作:

    JScript Debugger - Breaking on JScript runtime error -(n http://img138.imageshack.us/img138/1586/whycomwhy.png

    我不知所措。我也尝试过让IsInstalled成为一个属性而不是一个方法,在IDL中使用VARIANT\u BOOL而不是boolean而不是BOOL。

    标题:

    afx_msg VARIANT_BOOL IsInstalled();
    

    实施:

    afx_msg VARIANT_BOOL
    CMyAXCtrl::IsInstalled()
    {
       return TRUE;
    }
    

    调度图:

    BEGIN_DISPATCH_MAP(CMyAXCtrl, COleControl)
       DISP_FUNCTION_ID(CMyAXCtrl, "IsInstalled", dispidIsInstalled, IsInstalled, VT_BOOL, VTS_NONE)
    END_DISPATCH_MAP()
    

       [ uuid(6B662202-CF13-4144-AA33-C3FEE9C2C962),
          helpstring("Dispatch interface for My Control")]
       dispinterface _Daxplugin
       {
       properties:
       methods:
          [id(1)] VARIANT_BOOL IsInstalled();
       };
    

    如果有任何其他相关的代码位我应该提供,让我知道。但我被难住了。提前谢谢!

    2 回复  |  直到 15 年前
        1
  •  3
  •   tyranid    15 年前

    对于可编写脚本的函数,您几乎肯定有错误的原型。脚本语言的OLE自动化往往依赖于返回HRESULT,然后对实际返回代码使用out参数。

    所以把它改成 [id(1)] HRESULT IsInstalled(VARIANT_BOOL* p);

    希望其中一些确实有用,但如果没有实际的错误,我可能会弄错:)

        2
  •  0
  •   David Feurle    15 年前

    您可以通过实现IObjectSafety或在注册对象时将对象标记为save来将控件标记为save以进行脚本编写(正如您提供的链接所假定的那样)。

    添加代码后是否运行regsvr32以将其标记为保存以进行脚本编写?

    如果控件设置了脚本位的保险箱,则可以检查注册表。 {7DD95802-9882-11CF-9FA9-00AA006C42C4} (Safe for Initialization) {7DD95801-9882-11CF-9FA9-00AA006C42C4}(Safe For Scripting) 作为对象中实现的类别的子键。