编写一个简单的ActiveX控件,用于IE,它只有一个方法。

5
我正在学习如何编写可脚本化的ActiveX控件。我的目标是创建一个小型控件,可以检查系统上是否安装了某些东西。我已经完成的工作包括:
  • 在VS2008中创建了一个MFC ActiveX控件项目
  • 添加了一些“对于脚本来说是安全的”位,这些位可以在这里找到。
  • 扩展了IDL以提供我的“IsInstalled”方法,该方法现在无条件返回TRUE(但以后将从注册表中读取一些键)。
  • 构建控件并在其上运行regsvr32。我验证了它确实显示在HKEY_CLASSES_ROOT中,并且当我实例化对象时,IE开发人员工具的“Locals”窗格显示该对象是类型为_D [我的插件名称]。不仅如此,我的IsInstalled()方法也显示在该对象下面。

然而,当我调用IsInstalled()时,它就无法正常工作:

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

我很困惑。我还尝试过将IsInstalled变成属性而不是方法,使用VARIANT_BOOL而不是BOOL在IDL中,等等。

这里是相关代码的摘录。

头文件:

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()

IDL的分发部分:

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

如果您需要其他相关的代码,请告诉我。但是我在这里被难住了。提前谢谢!


你遇到了什么JScript运行时错误?从你的图片来看只显示了“(n”,这并没有什么太大帮助。 - Eric Brown
这就是它的确切含义。我无法弄清楚如何显示完整的运行时错误。无论如何,请看下面我的评论 - 现在有点无关紧要了。 - joshk0
2个回答

3
您几乎肯定拥有错误的脚本函数原型。针对脚本语言的OLE自动化通常依赖于返回HRESULT,然后使用输出参数作为实际返回代码。
因此,请将其更改为 [id(1)] HRESULT IsInstalled(VARIANT_BOOL* p); 另外,TRUE!= VARIANT_TRUE,您必须返回VARIANT_TRUE,它等于-1而不是1。
希望这些内容能够帮到您,但如果没有实际错误,我可能会误解 :)

我最终在ATL中重写了整个程序,因为它具有更清晰的接口来实现安全脚本部分,并且我自己发现了这个HRESULT问题。然而,因为这个原因,我不确定是否真的想授予赏金,因为我是自己解决的。无论如何,还是谢谢。 - joshk0

0

你可以通过实现IObjectSafety接口或在注册对象时将其标记为可供脚本保存(如你提供的链接所述)来将控件标记为可供脚本保存。

在添加代码以将其标记为可供脚本保存后,你是否运行了regsvr32?

你可以检查注册表,看看你的控件是否设置了安全脚本位。如果设置了这些位,你会在对象的ImplementedCategories子键中找到两个键:{7DD95802-9882-11CF-9FA9-00AA006C42C4}(用于初始化的安全){7DD95801-9882-11CF-9FA9-00AA006C42C4}(用于脚本的安全)

我建议实现IObjectSafety,因为它不依赖于你的类自行注册。


我使用了CodeProject上的示例项目,其中包括手动注册这两个CLSID。脚本安全性不是问题,否则我根本无法实例化对象。问题发生在稍后。 - joshk0
如果我正确理解了文档,IE将实例化ActiveX控件,但如果它没有找到适用于脚本的安全属性,则不允许从脚本访问。 - David Feurle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接