开发者

How do I get HRESULT returns from libraries imported to c# with tlbimp.exe?

开发者 https://www.devze.com 2023-01-12 16:28 出处:网络
I am using th开发者_StackOverflow中文版e GMFBridge directshow filter from c# and the import library seems to discard the HRESULTs. i.e

I am using th开发者_StackOverflow中文版e GMFBridge directshow filter from c# and the import library seems to discard the HRESULTs. i.e

[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);

is translated (by midl.exe and tlbimp.exe) into:

[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);

Other COM libraries I have imported translate returned values as out parameters and preserve the HRESULT return value of the original COM method. Why does this library behave differently? Is it possible to force the other behaviour?

Thanks, Andy


The .NET convention is to turn [out, retval] into a C# return value, and turn failure HRESULTs into COMException objects, with the HRESULT in the ErrorCode property. I think you're stuck if you want to see non-error HRESULTs.

I'd be interested to see the IDL declarations of the methods that produced raw HRESULTs after translation - the example in your question is what I'd expect to see normally.

0

精彩评论

暂无评论...
验证码 换一张
取 消