我试图编组以下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
编组有关,但命名不正确。