C#で作ったDLLのAPIにC++から構造体のポインタを渡して、結果を書き込んでもらう

[CPP][C#]

※追記 これはダメなやり方。
※MarshalクラスのMarshal.PtrToStructure()/Marshal.StructureToPtr()を使おう

※ネタ元


 
 
これで正解なのかわからないが、とりあえずできたのでメモ。

C#の方はunsafeを有効にしておく。
f:id:shikaku:20131003183200j:plain

C#側

[DllImport("kernel32.dll")]
static extern unsafe void CopyMemory(void* dst, void* src, int size);

// 受け渡し用構造体(32bit前提)
[StructLayout(LayoutKind.Sequential)]
public struct StData
{
    public Int32 data0;
    public Int32 data1;
    public Int32 data2;
    public Int32 data3;
    public Int32 data4;
};

public bool GetData(int p_data){

    StData data;

    data.data0 = 100;
    data.data1 = 200;
    data.data2 = 300;
    data.data3 = 400;
    data.data4 = 500;

    unsafe
    {
        CopyMemory((void*)p_data, &p_data, sizeof(StData));
    }
}


C++側(32bitアプリ)

// 受け渡し用構造体
typedef struct _StData
{
    long data0;
    long data1;
    long data2;
    long data3;
    long data4;
}StData;

...
{
	CoInitialize(0);
	{
		CCSharpModule obj;

		if( obj.CreateDispatch(CLSID_CSharpModule) != FALSE ){

			StData st_data;

			obj.GetData((long)&st_data);

		}else{
			// 失敗
		}

		// 後片付け
		obj.ReleaseDispatch();
	}
	CoUninitialize();
}

C#でDLLを作ってC++から呼ぶ基本手順はこちら


ネタ元