すみません。マーシャリングについて再度ご質問させてください。
アンマネージコードの
BSTR* AAA
というwchar_t型の配列ポインタをある関数の引数でもらってその関数内で
array<System::String^> BBB
のマネージコードのstring配列にマーシャリングしたいのですがMarshalの
メソッドを使えば出来ますでしょうか?
Marshal::PtrToStringUni
を使用すれば配列の1つ1つに対してマーシャリング出来るのですが配列の要素分
処理を書かなければならないので可能であれば一気にマーシャリング出来るやり
型を探しております。
ご教授お願いします。
>wchar_t型の配列ポインタ
ってどういうルールで配列の終わりを決めていますか?NULL?
どっちにせよSafeArrayみたいにいくつ配列があるかとかの情報を持っている型でないと
一気にはできないでしょう。
>配列の要素分処理を書かなければならない
とは?ループ処理でできない?
>>Blueさん
お世話になります。
>>>wchar_t型の配列ポインタ
>>ってどういうルールで配列の終わりを決めていますか?NULL?
関数の引数でもう1つint型のパラメータをもらっていましてそれが配列の要素数
になります。
>>>配列の要素分処理を書かなければならない
>>とは?ループ処理でできない?
for(i =0; i < count; i++)
{
BBB[i] = Marshal::PtrToStringUni((IntPtr)AAA[i]);
}
で要素分のループをさせて処理出来ますがこれでも特に問題はございませんでし
ょうか?
問題ないかと。
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]));
}
って風にできます。
>>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にてマーシャリ
ングをしたいと思います。
また何かありましたらその節は宜しくお願い致します。