>最初の書き込みでCreateData内でByte bt[8]をsprintf_s((char*)data->bt, 8, test);
>char型にキャストしているのでこれが原因かもしれません・・・。
引数の data が最初の書き込みのままであれば問題なさそうですが、
ちょっとこれだけではなんとも。。。
ちなみにアンマネージ側でByte型にしてます?
混乱の元になりそうなので unsigned char にした方が無難と思います。
(windows.h をインクルードしていれば BYTE でも可)
こちらで検証したコードを載せておきますので参考にしてください。
#include stdafx.h
using namespace System;
using namespace System::Runtime::InteropServices;
//アンマネージの構造体
struct uDATA
{
long a;
short b;
short c;
unsigned char d[8];
};
//マネージの構造体
[StructLayout(LayoutKind::Sequential)]
value struct mDATA
{
Int32 a;
Int16 b;
Int16 c;
[MarshalAs(UnmanagedType::ByValArray, SizeConst=8)]
array<Byte>^ d;
};
void SendData(mDATA mdata);
int _tmain(int argc, _TCHAR* argv[])
{
try {
uDATA udata = {1, 2, 3, {'t', 'e', 's', 't', 0}};
SendData(static_cast<mDATA>(Marshal::PtrToStructure(IntPtr(&udata),
mDATA::typeid)));
}
catch(Exception^ ex) {
Console::WriteLine(ex->Message);
Console::WriteLine(ex->StackTrace);
}
Console::ReadKey();
return 0;
}
void SendData(mDATA mdata)
{
//TODO
Console::WriteLine(mdata.a.ToString());
Console::WriteLine(mdata.b.ToString());
Console::WriteLine(mdata.c.ToString());
for each(Byte b in mdata.d) {
Console::WriteLine(safe_cast<Char>(b));
}
}
>>subaruさん
>>ちなみにアンマネージ側でByte型にしてます?
>>混乱の元になりそうなので unsigned char にした方が無難と思います。
おっしゃられた通りunsigned charで定義しなおしたら上手く型が合いました。
一緒に動作検証まで付き合って頂きありがとうございました。また何かありましたら宜し
くお願いします。