- PR -

構造体中の文字列配列をマーシャリングしたい

1
投稿者投稿内容
優希
ベテラン
会議室デビュー日: 2003/08/12
投稿数: 92
投稿日時: 2004-04-09 20:10
お世話になります。
優希です。

マネージコード(VS.NET 2002(VC++))から
ネイティブコード(VC++4.0)で書かれたDLLを呼び出す過程で、
構造体中の文字列型の配列をマーシャリングしたいのです。
言い方が妥当か分かりませんが、
例を見てください。


以下は、呼び出されるネイティブコードです。
DLL名称は、「Sample.dll」とします。
コード:
///
/// 構造体
///
struct NativeTestStruct{
    unsigned short value;
    unsigned char  Message[20];
    unsigned char  Message2[5][30];	// ←ここが問題
};

///
/// 呼び出される関数
/// (参照渡しで値(構造体型)を返す関数)
///
NOMANGLE void CCONV GetData(struct NativeTestStruct *TestInf)
{
	NativeTestStruct TestInf;
	 :
	// データ設定
	
}




続いて、呼び出し側のマネージコードです。
コード:
///
/// 構造体
///
[ StructLayout( LayoutKind::Sequential, CharSet=CharSet::Auto )]
public __value struct ManagedTestStruct{
public:
	UInt16	value;
	[MarshalAs(UnmanagedType::ByValTStr, SizeConst=20)]
	String* Message;
	[MarshalAs(UnmanagedType::ByValArray, SizeConst=150)]	//←ここら辺も微妙。
	String* Message2[];
};

///
/// 関数の宣言
///
[DllImport("Sample.dll")]
static void GetData(ManagedTestStruct *TestInf);

///
/// 呼び出す関数
///
void SetData()
{
	ManagedTestStruct TestInf;
	TestInf.Message2 = new String*[5];	// 領域割り当て?

	// 関数呼び出し	
	GetData(&TestInf);					// ←ここでエラー
}



実行すると、
エラー内容は以下のようになりました。
引用:

型ManagedTestStructのフィールドMessage2をマーシャリングできません。
この型は、構造体フィールドとして、マーシャリングできません。



マーシャリングするには、
どのようにすれば良いか
アドバイスをお願い致します。
1

スキルアップ/キャリアアップ(JOB@IT)