黒龍's Blog

明日から役立つ無駄知識をあなたに(仮)

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  170  : 記事  0  : コメント  2719  : トラックバック  26

ニュース

わんくま同盟に参加させていただきました。
どうぞよろしくお願いします。

自己紹介

コミュニティ

  • わんくま同盟
    わんくま同盟

書庫

知ってる人からしたら当たり前なのかもですが不思議に思ったのでメモ。

C++/CLIですがアンマネージとの変換はいろいろ手法があります。まぁ文字列型もいろいろあるのでその辺は仕方ないんですが割と低レベルというかCレベルのものと組み合わせる時はconst char*になると思います。で、このconst char*とのやり取りですが.net からであればIntPtr ptr = Marshal::StringToHGlobalAnsi(text); あたりがメジャーかと思います。Marshal::FreeHGlobal(ptr);さえ忘れなければよくあるAnsi(sjis)な文字列との変換はオッケー。

で、タイトルに書いたmarshal_as<>ですがこいつも2008から入ってきたのと他の変換と同じに書けるのもあってモリモリ使ってました。が、こいつですが内部でWideCharToMultiByteを使っていることもあって現在のThreadのコードページの影響をうけます。どういうことかというとSystem:String^な文字列をSJISにしたいなぁって時にふつうのアプリからなら問題ないです。が、ローカライズで英語リソース読むようにCultureを変更するような場合だとSJISじゃなくてコードページ1252みたいなことになっちゃいます。

確かにローカライズで扱う文字も変わるとはいえアプリの本質も通信する先もSJISなのは変わらないので余計なお世話かなぁと感じた次第です。なのでSJISな奴との通信がある場合の変換はmarshal_asじゃなくStringToHGlobalAnsiあたりを使っとくほうが間違いがないと思います。上記挙動って覚えてればいいですがすっかり忘れる気がするので。

以上。あまり役に立たないかもな情報でした。

投稿日時 : 2012年2月7日 22:58

コメント

No comments posted yet.

Post Feedback

タイトル
名前
Url:
コメント