Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 'IDispatch::GetTypeInfo()'接口是否正确?_C++_Com_Atl_Throw_Idispatch - Fatal编程技术网

C++ 'IDispatch::GetTypeInfo()'接口是否正确?

C++ 'IDispatch::GetTypeInfo()'接口是否正确?,c++,com,atl,throw,idispatch,C++,Com,Atl,Throw,Idispatch,我试图查找有关IDispatch接口是否抛出的信息,特别是IDispatch::GetTypeInfo()是否抛出。IIRC,IDispatch::Invoke()可以,但是我似乎找不到关于这个主题和文档的任何内容,或者没有提到任何内容。任何标准COM接口都不会抛出。COM被设计成语言不可知论,包括没有例外的语言 COM对象的实现完全可能抛出,但这取决于对象本身的实现。通常,COM对象将通过返回其HRESULT的错误代码来指示错误。任何标准COM接口都不会抛出错误。COM被设计成语言不可知论,包

我试图查找有关
IDispatch
接口是否抛出的信息,特别是
IDispatch::GetTypeInfo()
是否抛出。IIRC,
IDispatch::Invoke()
可以,但是我似乎找不到关于这个主题和文档的任何内容,或者没有提到任何内容。

任何标准COM接口都不会抛出。COM被设计成语言不可知论,包括没有例外的语言

COM对象的实现完全可能抛出,但这取决于对象本身的实现。通常,COM对象将通过返回其HRESULT的错误代码来指示错误。

任何标准COM接口都不会抛出错误。COM被设计成语言不可知论,包括没有例外的语言


COM对象的实现完全可能抛出,但这取决于对象本身的实现。通常COM对象会通过返回其HRESULT的错误代码来指示错误。

@NeilButterworth,根据我发布的链接,它是ATL的一部分。
IDispatch::Invoke()
也不能抛出错误。如果它调用某个对象的函数,并且该函数试图跨越COM边界抛出它的未定义行为(COM函数不应泄漏异常),那么COM接口永远不允许抛出。不可能跨语言运行时边界正确处理异常。每个IDispatch接口方法都必须返回HRESULT的一个基本原因是“它不工作”,这是最重要的细节。语言绑定可以自由地将HRESULT转换为异常,它们通常会这样做。甚至在C++中,当您使用了γ导入指令时。Fwiw,不得不将一个复杂库函数的失败压缩成一个错误代码,这是COM+将中间件战争输给Java以及UWP出现问题的主要原因。@NeilButterworth,根据我发布的链接,它是ATL的一部分。
IDispatch::Invoke()
不能抛出这两个错误。如果它调用某个对象的函数,并且该函数试图跨越COM边界抛出它的未定义行为(COM函数不应泄漏异常),那么COM接口永远不允许抛出。不可能跨语言运行时边界正确处理异常。每个IDispatch接口方法都必须返回HRESULT的一个基本原因是“它不工作”,这是最重要的细节。语言绑定可以自由地将HRESULT转换为异常,它们通常会这样做。甚至在C++中,当您使用了γ导入指令时。FWW,必须将复杂的库函数的失败压缩为单个错误代码是COM+丢失了中间件对java的原因,也是为什么UWP有麻烦的主要原因。<代码> IDISPUTHON/C++ >是COM接口的C++包装器,所以我想它将实现一个投掷机制。我觉得这很奇怪。是的,我正在查看
OAld.h
,它是
Windows工具包
c:\Program Files(x86)\Windows Kits\8.1\Include\um\OAIdl.h
)的一部分,我假设它是VS安装的一部分。我猜想MS没有做任何疯狂的事情,并且让它扔,因为它会很容易混淆C/C++开发。<代码> IDISPATT/<代码>本身不是C++包装器,它只是其他任何一个COM接口。您可能使用C++包来实现<代码> IDISPATT/<代码>,但这是一个独立的问题。COM实现不允许抛出。但是,当检测到COM错误时,消耗COM接口的包装器可能会抛出(参见ATL中的类、.NET中的类等)<代码> IDISPATT/<代码>是COM接口的C++包装器,所以我认为它将实现一个投掷机制。是的,我正在查看
OAld.h
,它是
Windows工具包
c:\Program Files(x86)\Windows Kits\8.1\Include\um\OAIdl.h
)的一部分,我假设它是VS安装的一部分。我猜想MS没有做任何疯狂的事情,并且让它扔,因为它会很容易混淆C/C++开发。<代码> IDISPATT/<代码>本身不是C++包装器,它只是其他任何一个COM接口。您可能使用C++包来实现<代码> IDISPATT/<代码>,但这是一个独立的问题。COM实现不允许抛出。但是使用COM接口的包装器在检测到报告的COM错误时可能会抛出(请参见ATL中的类、.NET中的类等)