我试图编组以下C ++函数:

STDMETHODIMP CPushSource::SetSize(SIZE *pSize)
{
    CMutexLock lock(&m_csShared);
    CheckPointer(pSize, E_POINTER);

    m_iImageWidth = pSize->cx;
    m_iImageHeight = pSize->cy;

    saveSettings();

    return S_OK;
}


使用以下C#代码:

[ComImport, Guid("1b1afbaf-cb92-42da-8307-5a7be8c2b4b0")]
public interface ISCFHSettings
{
    [PreserveSig]
    int SetSize([In, MarshalAs(UnmanagedType.Struct)] Size size);
}


我试图用以下代码调用它:

m_desktopFilter.SetSize(new Size(320,240));


我对这种C ++ / C#互操作性知识很陌生,因此可以向我指出正确方向的任何人都将受到赞赏。

另外我得到的错误是:


  尝试读取或写入受保护的内存。这通常表明其他内存已损坏。


这很重要,这是我尝试使用DirectShow过滤器的简单包装。过滤器为SCFH-DSF。

我也试过

[ComImport, Guid("1b1afbaf-cb92-42da-8307-5a7be8c2b4b0")]
public interface ISCFHSettings
{
    [PreserveSig]
    int SetSize([In, MarshalAs(UnmanagedType.Struct)] MySize size);
}

[StructLayout(LayoutKind.Sequential)]
public struct MySize
{
    public int cx;
    public int cy;
}


并在调用代码中

MySize sz = new MySize();
sz.cx = 320;
sz.cy = 240;
m_desktopFilter.SetSize(sz);


这对我也不起作用。

[ComImport, Guid("1b1afbaf-cb92-42da-8307-5a7be8c2b4b0")]
public interface ISCFHSettings
{
    [PreserveSig]
    int SetSize(ref MySize size);
}

最佳答案

签名中的[MarshalAs(UnmanagedType.Struct)]不正确。该函数需要一个指向SIZE的指针,因此您需要定义它(如您所做的那样)并通过引用将其传递,而无需使用其他编组属性。

我希望您应该定义如下接口:

[ComImport, Guid("1b1afbaf-cb92-42da-8307-5a7be8c2b4b0")]
public interface ISCFHSettings
{

    int SetSize(MySize size);

}


[MarshalAs(UnmanagedType.Struct)]实际上与VARIANT编组有关,但命名不正确。

09-06 11:36