在我的几个COM对象中,函数的HResult可以是S_OK或S_FALSE,但是当我尝试在客户端应用程序中调用这些函数时,我总是得到S_OK = 0而且从不S_FALSE = 1。 例如,在ENumVariant中,如果我写
,则使用Next方法或Resetresult:=S_False
在服务器代码中,如果我在客户端代码中测试HResult,我总是得到0(S_OK)。
我使用XE8。我做了一个MCVE。 服务器的代码在这里: enter link description here 并且客户端的代码在这里: enter link description here
使用WriteToTrace
函数中的Reset
,我可以看到Reset
被调用。在测试程序中,Return
是allways = 0。如果我致电Next
或Clone
我强行Result:=S_FALSE
,那就相同了。
答案 0 :(得分:-1)
我找到的唯一解决方案是导入类型库并使用早期绑定。
我发布我的发现,希望有人可以提供更好的解决方案。
我验证了OP所描述的内容。我可以重现这个问题如下。我使用向导创建了一个自动化对象,在类型库编辑器中,我将祖先从IDispath
更改为IEnumVARIANT
。对于IEnumVARIANT
的实施,我只为每个S_FALSE
添加了HResults
。
当与导入类型库的应用程序一起使用时,我会按预期获得S_FALSE
,但是一旦我使用CreateOLEObject
,我每次都会获得S_OK
。
这就是我认为发生的事情。 IEnumVARIANT
的调用约定为stdcall
,这是正确的,它们仅返回HResult
。但似乎当通过调度接口调用它们时,结果会丢失,并且始终会返回S_OK
。我想知道stdcall
是否被隐式重新加载为safecall
,但是又一次......我们得到了一个结果,所以我废弃了这个想法。