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 に答える