C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: marshal.hが見つかりません


(過去ログ 94 を表示中)

[トピック内 11 記事 (1 - 11 表示)]  << 0 >>

■56174 / inTopicNo.1)  marshal.hが見つかりません
  
□投稿者/ まかろに (1回)-(2011/01/03(Mon) 00:33:42)

分類:[C++/CLI] 

文字列の変換で marshal_as を使いたいのですが
普通にインクルードしようとしてもmarshal.hが見つかりません。
検索しても引っかかりませんでした。
このファイルはどこにあるんでしょうか?

よろしくお願い致します。

[環境]
WindowsXP
Visual Studio 2005

引用返信 編集キー/
■56175 / inTopicNo.2)  Re[1]: marshal.hが見つかりません
□投稿者/ とっちゃん (559回)-(2011/01/03(Mon) 01:57:28)
とっちゃん さんの Web サイト
No56174 (まかろに さん) に返信
> 文字列の変換で marshal_as を使いたいのですが
> 普通にインクルードしようとしてもmarshal.hが見つかりません。
> 検索しても引っかかりませんでした。
> このファイルはどこにあるんでしょうか?
>
http://support.microsoft.com/kb/311259/ja

によると、VS2008から導入されているみたいです。

> [環境]
> WindowsXP
> Visual Studio 2005
>
残念ですが、2005環境では使えないものと思われます。

引用返信 編集キー/
■56179 / inTopicNo.3)  Re[2]: marshal.hが見つかりません
□投稿者/ επιστημη (2581回)-(2011/01/03(Mon) 15:19:49)
επιστημη さんの Web サイト
>>文字列の変換で marshal_as を使いたいのですが
>>普通にインクルードしようとしてもmarshal.hが見つかりません。

そゆわけで2005ではmarshalが使えませんです。
「文字列の変換」て、どんな変換がお望みでしょうか?

引用返信 編集キー/
■56184 / inTopicNo.4)  Re[3]: marshal.hが見つかりません
□投稿者/ まかろに (2回)-(2011/01/03(Mon) 21:22:53)
なるほど、そもそも無理でしたか。
納得しました。ありがとうございます m(_ _)m

> 「文字列の変換」て、どんな変換がお望みでしょうか?

やりたいこととしては、マネージドの System::String から std::string に持って行きたかったのです。
とっちゃんさんがリンクを張ってくださった先の StringToHGlobalAnsi を使ってみようかと思うんですが
もっとベターな方法がありますかね?
引用返信 編集キー/
■56185 / inTopicNo.5)  Re[4]: marshal.hが見つかりません
□投稿者/ επιστημη (2582回)-(2011/01/03(Mon) 21:53:37)
επιστημη さんの Web サイト
> StringToHGlobalAnsi を使ってみようかと思うんですが

encodingをUTF-8とかに変換したいんじゃないならそれでいんじゃないでしょか。

引用返信 編集キー/
■56187 / inTopicNo.6)  Re[4]: marshal.hが見つかりません
□投稿者/ とっちゃん (560回)-(2011/01/04(Tue) 09:48:38)
とっちゃん さんの Web サイト
No56184 (まかろに さん) に返信
> なるほど、そもそも無理でしたか。
> 納得しました。ありがとうございます m(_ _)m
>
>>「文字列の変換」て、どんな変換がお望みでしょうか?
>
> やりたいこととしては、マネージドの System::String から std::string に持って行きたかったのです。
> とっちゃんさんがリンクを張ってくださった先の StringToHGlobalAnsi を使ってみようかと思うんですが
> もっとベターな方法がありますかね?

思い出した!たしか、VS2005 にも vcclr.h というヘッダーがあったと思います。

これに PtrToStringChars() というインラインの変換関数があるので利用を検討してみてはいかがでしょう?
これ+CW2A オブジェクトを利用すれば、解放処理なしで文字列変換ができるはずです。

手元にVS2005がないので、そろってるかどうかわからんところもありますが。。。

引用返信 編集キー/
■56200 / inTopicNo.7)  Re[5]: marshal.hが見つかりません
□投稿者/ επιστημη (2583回)-(2011/01/04(Tue) 20:32:35)
επιστημη さんの Web サイト
> PtrToStringChars() というインラインの変換関数

これってinterior_ptr<wchar_t> 返すのよねぇ。

> 解放処理なしで文字列変換ができるはずです。

えーと、こんなんかなー

// compile option: -clr
#include <iostream>
#include <string>
#include <AtlBase.h> // CW2A

int main() {
  System::String^ input = gcnew System::String(L"日本ちゃちゃちゃ");
  pin_ptr<wchar_t> ptr(&input->ToCharArray()[0]);
  std::string result = ATL::CW2A(ptr);
  std::cout << '[' << result << ']' << std::endl;
}

引用返信 編集キー/
■56206 / inTopicNo.8)  Re[6]: marshal.hが見つかりません
□投稿者/ まかろに (3回)-(2011/01/04(Tue) 22:25:44)
> > PtrToStringChars() というインラインの変換関数
>
> これってinterior_ptr<wchar_t> 返すのよねぇ。
>
>>解放処理なしで文字列変換ができるはずです。
>
> えーと、こんなんかなー
>
> // compile option: -clr
> #include <iostream>
> #include <string>
> #include <AtlBase.h> // CW2A
>
> int main() {
> System::String^ input = gcnew System::String(L"日本ちゃちゃちゃ");
> pin_ptr<wchar_t> ptr(&input->ToCharArray()[0]);
> std::string result = ATL::CW2A(ptr);
> std::cout << '[' << result << ']' << std::endl;
> }

なるほど、こんなやり方もあるんですね。
そんなに頻繁にする処理でもないのでStringToHGlobalAnsiも含めてちょっと考えてみます。
ありがとうございました。

解決済み
引用返信 編集キー/
■56234 / inTopicNo.9)  Re[7]: marshal.hが見つかりません
□投稿者/ Blue (34回)-(2011/01/06(Thu) 09:27:41)
> pin_ptr<wchar_t> ptr(&input->ToCharArray()[0]);
> std::string result = ATL::CW2A(ptr);
ATL::CW2Aってヌル文字で終端していなくても使えるのですかね?
それともString::ToCharArrayは必ずヌル文字で終端するのでしょうか?

解決済み
引用返信 編集キー/
■56253 / inTopicNo.10)  Re[8]: marshal.hが見つかりません
□投稿者/ επιστημη (2585回)-(2011/01/06(Thu) 20:04:48)
επιστημη さんの Web サイト
> ATL::CW2Aってヌル文字で終端していなくても使えるのですかね?
> それともString::ToCharArrayは必ずヌル文字で終端するのでしょうか?

あ...そーいやそぉね。
おとなしく WideCharToMultiByte でも使っておくが吉みたい。

引用返信 編集キー/
■56295 / inTopicNo.11)  Re[9]: marshal.hが見つかりません
□投稿者/ επιστημη (2586回)-(2011/01/08(Sat) 08:27:08)
επιστημη さんの Web サイト
> おとなしく WideCharToMultiByte でも使っておくが吉みたい。

やってみた。あんまおとなしくなかったw

#include <iostream>
#include <string>
#include <cassert>
#include <windows.h>

int main() {
  System::String^ input = gcnew System::String(L"日本ちゃちゃちゃ");
  std::string result;
  int codepage = 932; // shift_jis
  if ( input->Length != 0 ) {
    // wideなmanaged配列を手に入れて
    array<wchar_t>^ winput = input->ToCharArray();
    // アドレスをピン留めし
    pin_ptr<wchar_t> ptr(&winput[0]);
    // 変換後の長さを調べて
    int size = WideCharToMultiByte(codepage, 0, ptr, winput->Length, 0, 0, 0, 0);
    assert( size != 0 );
    // 領域を確保して
    result.assign(size, '\0');
    // ほんでもって変換、と。
    size = WideCharToMultiByte(codepage, 0, ptr, winput->Length, &result[0], size, 0, 0);
    assert( size != 0 );
  }
  std::cout << result << std::endl;
}

codepageが選べるってオマケがついたので許しておくれね。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -