使用 iDispatch DISPATCH_PROPERTYGET 在 IE 中拒绝权限
Posted
技术标签:
【中文标题】使用 iDispatch DISPATCH_PROPERTYGET 在 IE 中拒绝权限【英文标题】:Permission Denied in IE w/ iDispatch DISPATCH_PROPERTYGET 【发布时间】:2010-12-15 07:58:17 【问题描述】:我有一个使用 ATL 编写的 ActiveX 控件,但遇到了一个有点严重和令人困惑的问题。当使用 DISPATCH_PROPERTYPUT/METHOD 调用 iDispatch::Invoke 时,一切都很好。当我向 IE javascript 返回一个值时,在使用有效 BSTR 调用 VT_BSTR 的方法之后,它可以正常工作。
但是当我尝试时:
var stringValue = Object.stringValue;
调用 iDispatch 并使用 DISPATCH_PROPERTYGET 标志调用,并且我将返回值设置为 VT_BSTR 并使用有效的 BSTR(与我在方法调用中使用的完全相同),我在 IE 中得到一个权限被拒绝的错误框。
当我将各种其他数据类型(长整型、整数、布尔值等)返回到 IE javascript 时,它可以正常工作(使用 propertyGet() 方法)。我只在返回 VT_BSTR 时获得权限被拒绝。
有什么想法吗?
【问题讨论】:
你能发布你的get方法实现吗?我假设你没有返回 E_ACCESSDENIED。 你好,pvarResult->bstrVal = (BSTR)c; pvarResult->vt = VT_BSTR; if (wFlags == DISPATCH_PROPERTYGET) 返回 S_OK;作为说明,我刚刚在几天前放置了 if wflags == DISPATCH_PROPERTYGET 语句,以确保事情正在返回 S_OK。这对我来说是一个非常令人困惑的问题..我已经倾注了 msdn 上的 idispatch 位,但没有发现太多表明我做错了什么。在调试 bstr 时也是有效的。当在 wflags 中设置 dispatch_method 时,相同的代码块可以工作。 抱歉格式化。 pvarResult->bstrVal = (BSTR)c; pvarResult->vt = VT_BSTR; if (wFlags == DISPATCH_PROPERTYGET) 返回 S_OK 你可以编辑你的帖子,以一种很好的格式添加代码。 【参考方案1】:在您上面的评论中,您将 c 转换为 BSTR。什么是c?如果您实际上并未调用 SysAllocString() 来创建 BSTR,那么这很可能是您的问题的根源。
考虑使用 CComBSTR 或 CComVARIANT 在此过程中为您提供帮助,也请阅读Eric's complete guide to BSTR semantics。
【讨论】:
我过去曾为那部分代码尝试过 SysAllocString,然后再次尝试使用相同的权限被拒绝错误...真是令人头疼,我也尝试过 CComVARIANT / CComBSTR 没有运气.. 你能发布更多的代码吗?你所拥有的应该没问题,但看起来你可能做错了。还包括您的 IDL 定义。 我会看看能不能再放点东西,但大多数情况下就是这样......至于 IDL 文件,它相当简单,我返回的方法没有定义在 idl 中 .. 用 property_method 调用的方法也没有在 idl 文件中定义并且工作正常.. (我们自己填写 getidsofnames 似乎工作正常)可能有一些非常奇怪的东西我错过了,需要继续玩与。 我敢打赌,遗憾的是,这个项目不可能做到这一点。另外,我认为问题出在代码的不同部分……因为 propertyget 和 propertyput 确实适用于非 bstr 值。当我弄清楚一些事情时,我会更新它,这样世界就不会那么混乱了。以上是关于使用 iDispatch DISPATCH_PROPERTYGET 在 IE 中拒绝权限的主要内容,如果未能解决你的问题,请参考以下文章
LPDISPATCH是啥数据类型,他和IDispatch有啥关系
通过 CComPtr<IDispatch> Invoke 检索数组
IDispatch::Invoke(DISPATCH_PROPERTYGET) 是不是会增加返回的 IDispatch 接口上的引用计数?
使用 iDispatch DISPATCH_PROPERTYGET 在 IE 中拒绝权限
对于进程间 COM 对象,在不使用 QueryInterface 的情况下将 IDispatch* 转换为 IUnknown* 是不是安全?