为具有一种方法的IE编写简单的ActiveX控件

jos*_*hk0 5 c++ com activex visual-studio-2008

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

  • 在VS2008中创建MFC ActiveX控件项目
  • 添加一些我在这里找到的'安全的脚本'位.
  • 扩展IDL以提供我的"IsInstalled"方法,该方法现在无条件地返回TRUE(但稍后会从注册表中读取一些键.)
  • 构建控件并在其上运行regsvr32.我确认它确实显示在HKEY_CLASSES_ROOT中,当我实例化该对象时,IE Developer Tools"Locals"窗格显示该对象的类型为_D [我的插件名称].不仅如此,我的IsInstalled()方法显示在该对象下面.

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

JScript调试器 - 打破JScript运行时错误 - (n http://img138.imageshack.us/img138/1586/whycomwhy.png

我不知所措.我也试过让IsInstalled成为一个属性而不是一个方法,在IDL中使用VARIANT_BOOL代替boolean而不是BOOL,你可以命名它.

这是相关的代码摘录.

标题:

afx_msg VARIANT_BOOL IsInstalled();
Run Code Online (Sandbox Code Playgroud)

实施:

afx_msg VARIANT_BOOL
CMyAXCtrl::IsInstalled()
{
   return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

发货地图:

BEGIN_DISPATCH_MAP(CMyAXCtrl, COleControl)
   DISP_FUNCTION_ID(CMyAXCtrl, "IsInstalled", dispidIsInstalled, IsInstalled, VT_BOOL, VTS_NONE)
END_DISPATCH_MAP()
Run Code Online (Sandbox Code Playgroud)

IDL的发送部分:

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

如果我应该提供任何其他相关的代码,请告诉我.但我很难过.先感谢您!

tyr*_*nid 3

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

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

另外 TRUE != VARIANT_TRUE,您必须返回 VARIANT_TRUE,它等于 -1 而不是 1。

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