我正在学习如何编写可编写脚本的 ActiveX 控件。我的目标是拥有一个微型控件,可以检查系统上是否安装了某些东西。到目前为止我所做的是:
- 在VS2008中创建一个MFC ActiveX控件项目
- 添加一些我发现的“脚本安全”位 here .
- 扩展 IDL 以提供我的“IsInstalled”方法,该方法现在无条件返回 TRUE(但稍后会从注册表中读取一些键。)
- 构建控件并在其上运行 regsvr32。我确认它确实出现在 HKEY_CLASSES_ROOT 中,并且当我实例化该对象时,IE 开发人员工具的“本地” Pane 显示该对象的类型为 _D[我的插件名称]。不仅如此,我的 IsInstalled() 方法还显示在该对象下方。
但是,当我调用 IsInstalled() 时,我无法让它工作:
我很迷茫。我也试过使 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/