0

我正在尝试编组以下 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);
}
4

2 回答 2

1

如前所述,您应该可以使用ref. 您可以对此进行扩展,直到您获得可以满足您需求的东西。

C#:

using System.Diagnostics;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    public struct mySize
    {
        public int x, y;
    }

    static class Program
    {
        [DllImport("ClassLibrary.dll")]
        static extern int getX(ref mySize size);

        static void Main(string[] args)
        {
            var size = new mySize { x=100, y=200 };
            int x = getX(ref size);
            Debug.Assert(x == 100);
        }
    }
}

VC++:

struct mySize
{
    int x, y;
};

extern "C" __declspec(dllexport)
int  __stdcall getX(mySize *pSize)
{
    return pSize->x;
}
于 2012-08-06T07:55:31.030 回答
1

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

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

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

    int SetSize(MySize size); 

}

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

于 2012-08-06T07:25:13.233 回答