繁体   English   中英

p / invoke操作最终执行了另一个功能

[英]p/invoke operation ends up with executing another function

不知道为什么会这样,但是当我执行我的c#函数之一时,可以由以下c#接口定义:

[ComImport, Guid("EA5435EA-AA5C-455d-BF97-5F19DC9C29AD"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IClosedCaptionsDecoder2 
{
    [PreserveSig]
    int SetConfig([In] ref ClosedCaptionsDecoderConfig config);
    [PreserveSig]
    int GetConfig([Out] out ClosedCaptionsDecoderConfig config);
}

和C ++接口:

    interface __declspec(uuid("{EA5435EA-AA5C-455d-BF97-5F19DC9C29AD}"))
    IClosedCaptionsDecoder2 : public IClosedCaptionsDecoder
    {
        STDMETHOD(SetConfig)(IN CLOSEDCAPTIONSDECODERCONFIG& config) PURE;
        STDMETHOD(GetConfig)(OUT CLOSEDCAPTIONSDECODERCONFIG* pConfig) PURE;
    };

im重定向到由“先前”接口声明的另一个函数。 当我尝试执行以下命令时,例如:config-> SetConfig(....)。 重定向到(或要执行的下一个命令)的函数由IClosedCaptionsDecoder2的基类(称为IClosedCaptionsDecoder)实现

该接口的c ++定义为:

interface __declspec(uuid("{26B8D7F1-7DD8-4a59-9663-8D00C03135F7}"))
        IClosedCaptionsDecoder : public IUnknown
        {
            STDMETHOD(xxx)(IExternalCCObserver* pObserver, LONG lFlags) PURE;
        };

因此config-> SetConfig()实际上会调用config-> xxx(),我猜这是该函数的缺点。

我什至试图在c#端定义整个关系(继承等),但这也不起作用。

我将不胜感激任何帮助。 谢谢!

编辑:当我尝试调用GetConfig()时,它实际上执行了SetConfig()。 所以我肯定有指针偏移量左右的问题。 每个函数都按脱位顺序调用前一个函数,这怎么可能?

Edit2 :我设法通过将所有函数添加到IClosedCaptionsDecoder2接口来解决这种情况。

这是在CLR中实现COM互操作的方式的缺陷的副作用。 当接口从IUnknown或IDispatch以外的其他接口派生时,它无法将接口的方法正确映射到v表插槽。 即使第一个方法已被具体的coclass实现中的继承接口的方法占用,它仍将第一个方法映射到第一个可用插槽。 不支持多重继承的副作用。 因此,出问题的是,当客户端代码调用IClosedCaptionsDecoder :: xxx()时,它将最终调用IClosedCaptionsDecoder2 :: SetConfig()。

解决方法虽然简单却令人不快,但您必须将接口展平,使其包含继承的方法。 在您的情况下,将是:

[ComImport, Guid("EA5435EA-AA5C-455d-BF97-5F19DC9C29AD"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IClosedCaptionsDecoder2 
{
    // Methods inherited from IClosedCaptionsDecoder:
    [PreserveSig]
    int xxx(whatever...);
    // Methods specific to IClosedCaptionsDecoder2
    [PreserveSig]
    int SetConfig([In] ref ClosedCaptionsDecoderConfig config);
    [PreserveSig]
    int GetConfig([Out] out ClosedCaptionsDecoderConfig config);
}

该法律已于9月30日在美国成为法律,仅剩下6周的时间才能开始工作;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM