我想馬歇爾下面的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