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

C++ 为IE编写具有一种方法的简单ActiveX控件,c++,visual-studio-2008,com,activex,C++,Visual Studio 2008,Com,Activex,我正在学习如何编写可编写脚本的ActiveX控件。我的目标是拥有一个微型控件,可以检查系统上是否安装了某些东西。到目前为止,我所做的是: 在VS2008中创建MFC ActiveX控件项目 添加一些我发现的“脚本安全”位 扩展IDL以提供我的“IsInstalled”方法,该方法目前无条件返回TRUE(但稍后将从注册表读取一些键) 构建控件并在其上运行regsvr32。我验证了它确实显示在HKEY_CLASSES_ROOT中,当我实例化该对象时,IE开发者工具“Locals”窗格显示该对象的类

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

  • 在VS2008中创建MFC ActiveX控件项目
  • 添加一些我发现的“脚本安全”位
  • 扩展IDL以提供我的“IsInstalled”方法,该方法目前无条件返回TRUE(但稍后将从注册表读取一些键)
  • 构建控件并在其上运行regsvr32。我验证了它确实显示在HKEY_CLASSES_ROOT中,当我实例化该对象时,IE开发者工具“Locals”窗格显示该对象的类型为_D[我的插件名称]。不仅如此,我的IsInstalled()方法也显示在该对象下面
但是,当我调用IsInstalled()时,我就是无法让它工作:

我不知所措。我还尝试将IsInstalled设置为一个属性而不是一个方法,在IDL中使用VARIANT_BOOL而不是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()
IDL的调度部分:

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

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

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

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

如果控件设置了脚本安全位,则可以检查注册表。 如果设置了位,您将找到两个键
{7DD95802-9882-11CF-9FA9-00AA006C42C4}(初始化安全)
{7DD95801-9882-11CF-9FA9-00AA006C42C4}(脚本安全)
作为对象中实现的类别的子键


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

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

所以把它改成
[id(1)]HRESULT已安装(变体p)

同样正确VARIANT_TRUE,必须返回VARIANT_TRUE,它等于-1而不是1


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

我使用了CodeProject中的示例项目,其中包括手动注册这两个CLSID。脚本安全不是问题,否则我根本无法实例化该对象。问题稍后会出现。如果我正确理解了文档,IE将实例化ActiveX控件,但如果找不到安全的脚本属性,IE将不允许从脚本访问。您遇到的JScript运行时错误是什么?您的图片仅显示“(n”,这并没有太大的帮助。这正是它的本质。我不知道如何显示完整的运行时错误。无论如何,请看我下面的评论-这现在是一个没有实际意义的问题。我最终在ATL中重写了整个内容,ATL有一个更清晰的接口来实现脚本位的安全性,我自己也发现了这个HRESULT问题。Howev呃,因为这个原因,我不确定我是否真的想奖励赏金,因为我确实是自己想出来的。无论如何,谢谢。