0

我正在使用来自 c# 的 GMFBridge directshow 过滤器,并且导入库似乎丢弃了 HRESULT。IE

[id(5), helpstring("Create render filters in empty render graph")]
HRESULT CreateRenderGraph(
  [in] IUnknown* pSourceGraphSinkFilter,
  [in] IUnknown* pRenderGraph,
  [out, retval] IUnknown** pRenderGraphSourceFilter);

[id(6), helpstring("Connect two graphs")]
HRESULT BridgeGraphs(
  [in] IUnknown* pSourceGraphSinkFilter,
  [in] IUnknown* pRenderGraphSourceFilter);

被(由 midl.exe 和 tlbimp.exe)翻译成:

[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(5)]
object CreateRenderGraph([In, MarshalAs(UnmanagedType.IUnknown)] object pSourceGraphSinkFilter, [In, MarshalAs(UnmanagedType.IUnknown)] object pRenderGraph);

[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType=MethodCodeType.Runtime), DispId(6)]
void BridgeGraphs([In, MarshalAs(UnmanagedType.IUnknown)] object pSourceGraphSinkFilter, [In, MarshalAs(UnmanagedType.IUnknown)] object pRenderGraphSourceFilter);

我导入的其他 COM 库将返回值转换为输出参数,并保留原始 COM 方法的 HRESULT 返回值。为什么这个库的行为不同?是否可以强制其他行为?

谢谢,安迪

4

1 回答 1

0

.NET 约定是[out, retval]将失败的 HRESULT 转换为 C# 返回值,并将 HRESULT 转换为属性COMException中的对象。ErrorCode如果您想查看非错误 HRESULT,我认为您会遇到困难。

我有兴趣查看在翻译后产生原始 HRESULT 的方法的 IDL 声明 - 您问题中的示例是我通常期望看到的。

于 2010-08-24T09:44:56.710 回答