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

标签 c++ visual-studio-2008 com activex

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

  • 在VS2008中创建一个MFC ActiveX控件项目
  • 添加一些我发现的“脚本安全”位 here .
  • 扩展 IDL 以提供我的“IsInstalled”方法,该方法现在无条件返回 TRUE(但稍后会从注册表中读取一些键。)
  • 构建控件并在其上运行 regsvr32。我确认它确实出现在 HKEY_CLASSES_ROOT 中,并且当我实例化该对象时,IE 开发人员工具的“本地” Pane 显示该对象的类型为 _D[我的插件名称]。不仅如此,我的 IsInstalled() 方法还显示在该对象下方。

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

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

我很迷茫。我也试过使 IsInstalled 成为属性而不是方法,在 IDL 中使用 VARIANT_BOOL 而不是 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();
   };

如果我应该提供任何其他相关代码,请告诉我。但我在这里被难住了。提前致谢!

最佳答案

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

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

同样为 TRUE != VARIANT_TRUE,您必须返回等于 -1 而不是 1 的 VARIANT_TRUE。

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

关于c++ - 为具有一种方法的 IE 编写一个简单的 ActiveX 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3495339/

相关文章:

dll - 为什么 COM DLL 被称为 'servers' ?

c++ - 关于 std::async 与 std::launch::async 参数启动的线程的混淆

visual-studio-2008 - Visual Studio 一直关闭

c++ - 如何将 C++ 嵌套类注册到 Lua

c# - 如何从 C# 中的集合中获取唯一值?

c++ - 如何在 Windows 7 上查看 .dmp 文件?

c++ - Windows Embedded Compact 7上发生意外的IConnectionPointImpl::Unadvise调用

c# - 在 C# 中使用 msi.dl 从 MSI 表中获取主键

c++ - 尝试使用 pthreads 访问共享数据数组时出现错误,无法访问内存地址

C++ 打开一个二进制文件