BSTR型の配列ポインタのマーシャリングについて

[戻る]
human 2009/08/31(月) 13:23:21
すみません。マーシャリングについて再度ご質問させてください。

アンマネージコードの

BSTR* AAA

というwchar_t型の配列ポインタをある関数の引数でもらってその関数内で

array<System::String^> BBB

のマネージコードのstring配列にマーシャリングしたいのですがMarshalの
メソッドを使えば出来ますでしょうか?

Marshal::PtrToStringUni

を使用すれば配列の1つ1つに対してマーシャリング出来るのですが配列の要素分
処理を書かなければならないので可能であれば一気にマーシャリング出来るやり
型を探しております。

ご教授お願いします。

Blue 2009/08/31(月) 13:41:19
>wchar_t型の配列ポインタ
ってどういうルールで配列の終わりを決めていますか?NULL?

どっちにせよSafeArrayみたいにいくつ配列があるかとかの情報を持っている型でないと
一気にはできないでしょう。

>配列の要素分処理を書かなければならない
とは?ループ処理でできない?

human 2009/08/31(月) 13:49:14
>>Blueさん

お世話になります。

>>>wchar_t型の配列ポインタ
>>ってどういうルールで配列の終わりを決めていますか?NULL?

関数の引数でもう1つint型のパラメータをもらっていましてそれが配列の要素数
になります。

>>>配列の要素分処理を書かなければならない
>>とは?ループ処理でできない?

for(i =0; i < count; i++)
{
  BBB[i] = Marshal::PtrToStringUni((IntPtr)AAA[i]);
}

で要素分のループをさせて処理出来ますがこれでも特に問題はございませんでし
ょうか?

Blue 2009/08/31(月) 14:37:41
問題ないかと。

C++/CLIであれば、Marshal::PtrToStringUniを使わなくても、
wchar_t*をStringクラスのコンストラクタに渡せると思いますので、

array<System::String^>^ BBB = gcnew array<System::String^>(count);
for (i = 0; i < count; ++i) {
    BBB[i] = gcnew String(AAA[i]);
}

でもできるかと。


動的配列でも可能なら

System::Collections::Generic::List<String^>^ B 
    = gcnew System::Collections::Generic::List<String^>();
for (i = 0; i < count; ++i) {
    BBB[i].Add(String(AAA[i]));
}

って風にできます。

human 2009/08/31(月) 16:42:56
[[解決]]
>>C++/CLIであれば、Marshal::PtrToStringUniを使わなくても、
>>wchar_t*をStringクラスのコンストラクタに渡せると思いますので、

>>array<System::String^>^ BBB = gcnew array<System::String^>(count);
>>for (i = 0; i < count; ++i) {
>>    BBB[i] = gcnew String(AAA[i]);
>>}
>>でもできるかと。
>>動的配列でも可能なら
>>System::Collections::Generic::List<String^>^ B 
>>    = gcnew System::Collections::Generic::List<String^>();
>>for (i = 0; i < count; ++i) {
>>    BBB[i].Add(String(AAA[i]));
>>}

アドバイスありがとうございました。Marshal::PtrToStringUni以外にもやり方が
いろいろとあることが分かり大変参考になりました。

特に問題ないとのことでしたので今回はMarshal::PtrToStringUniにてマーシャリ
ングをしたいと思います。

また何かありましたらその節は宜しくお願い致します。

古いスレッドには追加発言できません。