gpt4 book ai didi

c# - 如何在 C# 中编码 SIZE 结构?

转载 作者:行者123 更新时间:2023-11-28 03:33:36 25 4
gpt4 key购买 nike

我正在尝试编码以下 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# 互操作的东西有点陌生,所以非常感谢任何能为我指明正确方向的人。

另外我得到的错误是:

Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

如果重要的话,这是我对 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 的指针,因此您需要定义它(正如您所做的那样)并通过引用传递它,而不使用额外的编码属性。

我希望您应该像这样定义接口(interface):

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

int SetSize(MySize size);

}

[MarshalAs(UnmanagedType.Struct)] 实际上与 VARIANT 编码相关,但命名错误。

关于c# - 如何在 C# 中编码 SIZE 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11823844/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com