構造体のマーシャリングについて – 固定ページ 2 – プログラミング – Home

構造体のマーシャリングについて
 
通知
すべてクリア

[解決済] 構造体のマーシャリングについて

固定ページ 2 / 2

subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

>最初の書き込みで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));
}
}


返信引用
human
 human
(@human)
ゲスト
結合: 15年前
投稿: 26
Topic starter  

>>subaruさん

>>ちなみにアンマネージ側でByte型にしてます?
>>混乱の元になりそうなので unsigned char にした方が無難と思います。

おっしゃられた通りunsigned charで定義しなおしたら上手く型が合いました。
一緒に動作検証まで付き合って頂きありがとうございました。また何かありましたら宜し
くお願いします。


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました