无法在HResult中返回S_FALSE

时间:2015-08-20 23:01:18

标签: delphi

在我的几个COM对象中,函数的HResult可以是S_OK或S_FALSE,但是当我尝试在客户端应用程序中调用这些函数时,我总是得到S_OK = 0而且从不S_FALSE = 1。 例如,在ENumVariant中,如果我写

,则使用Next方法或Reset
result:=S_False

在服务器代码中,如果我在客户端代码中测试HResult,我总是得到0(S_OK)。

我使用XE8。我做了一个MCVE。 服务器的代码在这里: enter link description here 并且客户端的代码在这里: enter link description here

使用WriteToTrace函数中的Reset,我可以看到Reset被调用。在测试程序中,Return是allways = 0。如果我致电NextClone我强行Result:=S_FALSE,那就相同了。

1 个答案:

答案 0 :(得分:-1)

我找到的唯一解决方案是导入类型库并使用早期绑定。

我发布我的发现,希望有人可以提供更好的解决方案。

我验证了OP所描述的内容。我可以重现这个问题如下。我使用向导创建了一个自动化对象,在类型库编辑器中,我将祖先从IDispath更改为IEnumVARIANT。对于IEnumVARIANT的实施,我只为每个S_FALSE添加了HResults

当与导入类型库的应用程序一起使用时,我会按预期获得S_FALSE,但是一旦我使用CreateOLEObject,我每次都会获得S_OK

这就是我认为发生的事情。 IEnumVARIANT的调用约定为stdcall,这是正确的,它们仅返回HResult。但似乎当通过调度接口调用它们时,结果会丢失,并且始终会返回S_OK。我想知道stdcall是否被隐式重新加载为safecall,但是又一次......我们得到了一个结果,所以我废弃了这个想法。