読者です 読者をやめる 読者になる 読者になる

C++から.NET(C#)のDLLに文字列を含む構造体を渡して書き込んでもらう方法

[.net][CPP][C#]

C++側

typedef struct _StrData{

	INT32 num0;
	INT32 num1;
	INT32 num2;
	INT32 num3;
	INT32 num3;

	char moji0[5];	// 4文字
	char moji1[2];	// 1文字

	StrData(){
		num0 = num1 = num2 = num3 = num4 = 0;
		memset(moji0,0,5);
		memset(moji1,0,2);
	};
}StrData;

...

Invoke()でC# APIコール


C#

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct StrData
{
    public Int32 num0;
    public Int32 num1;
    public Int32 num2;
    public Int32 num3;
    public Int32 num4;

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 5)]
    public String moji0;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
    public String moji1;
};

....


public bool TestArray(string[] aData0, string[] aData1, int[] p_aOutput)
{
    int ret_i = 0;

    System.IntPtr ptr = new System.IntPtr(p_aOutput[ret_i]);
    StrData ret_StrData = (StrData)Marshal.PtrToStructure(ptr, typeof(StrData));
    ret_StrData.num0 = 100;
    ret_StrData.num1 = 110;
    ret_StrData.num2 = 90;
    ret_StrData.num3 = 100;
    ret_StrData.num4 = 100000;
    ret_StrData.moji0 = "1001";
    ret_StrData.moji1 = "a";

    Marshal.StructureToPtr(ret_StrData, ptr, true);
    ret_i++;

    return true;
}


ネタ元