文字列配列を持つ C# 構造体を、c# 構造体の void * と c# 構造体文字列配列メンバーの char** を受け入れるC++ 関数に送信したいと考えています。
構造体を c++ 関数に送信できましたが、問題は、c++ 関数から c# 構造体の文字列配列データ メンバーにアクセスできないことです。文字列配列を個別に送信すると、配列要素にアクセスできました。
サンプルコードは -
C# Code:
[StructLayout(LayoutKind.Sequential)]
public struct TestInfo
{
public int TestId;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public String[] Parameters;
}
[DllImport("TestAPI.dll", CallingConvention = CallingConvention.StdCall, EntryPoint "TestAPI")]
private static extern void TestAPI(ref TestInfo data);
static unsafe void Main(string[] args)
{
TestInfo testinfoObj = new TestInfo();
testinfoObj.TestId = 1;
List<string> names = new List<string>();
names.Add("first");
names.Add("second");
names.Add("third");
testinfoObj.Parameters=names.ToArray();
TestAPI(ref testinfoObj);
}
VC++ Code:
/*Structure with details for TestInfo*/
typedef struct TestInfo
{
int TestId;
char **Parameters;
}TestInfo_t;
//c++ function
__declspec(dllexport) int TestAPI(void *data)
{
TestInfo *cmd_data_ptr= NULL;
cmd_data_ptr = (TestInfo) data;
printf("ID is %d \r\n",cmd_data_ptr->TestId);//Working fine
for(i = 0; i < 3; i++)
printf("value: %s \r\n",((char *)cmd_data_ptr->Parameters)[i]);/*Error-Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt*/
}
メモリ スタックを分析すると、((char *)cmd_data_ptr->Parameters) を出力すると、最初の配列要素 ("first") が出力されますが、((char *)cmd_data_ptr->Parameters) を使用していることがわかります。 [i]、要素にアクセスできず、上記の例外が発生します。
構造メモリ アドレスにはすべての構造要素のアドレスが含まれていますが、C++ からデータにアクセスしている間は、文字列配列の最初の要素のみにアクセスしています。