我想马歇尔下面的C++函数:如何马歇尔在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);
}
我有一种感觉,在C#中的Size结构是从一个你的C++函数需要不同的,因此,你可能需要创建一个明确的结构在C#中使用C++所期望的确切字段。 – Davio 2012-08-06 07:09:46
我试过了,我有同样的问题。我会赞扬这一尝试。 – 2012-08-06 07:10:26
用该代码更新,同样的错误。 – 2012-08-06 07:14:04