Posted by & filed under programming, windows.


Visual C++ を触ってて一番感じたのは、従来の C,C++ 用のライブラリを使おうと思うとかなり面倒くさいということ。

.NET 用のクラスが新旧併せると結構あり、しかもそこにワイド文字(Unicode)、マルチバイト文字の区別も入ってきて訳がわかんない。

あとハンドルの概念もいまいち理解できてない。ポインタみたいなもの。と適当に覚えてるけど、ポインタとは扱い方が違う部分もあって困る。ポインタのポインタ( hoge** )はできるけど、ハンドルのハンドル( hoge^^ )はできないとか。

結構使う型変換の一つが、 System::String^ -> char*。

System::String は、内部では wchar で文字列を保持してるらしく、型変換は一筋縄ではいかないw

とはいえ、そこはきちんと関数が用意してあるので、それを使って変換してやればよい。

System::String^ hoge = gcnew System::String("あああああ");

char* p = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(hoge);
printf( p );
System::Runtime::InteropServices::Marshal::FreeHGlobal((IntPtr)p);

StringToHGlobalAnsi はネイティブヒープ領域を確保して利用するので、得た char* を使用後は、必ず FreeHGlobal で解放してやる必要がある。

Microsoft のサポートページの例では、キャストなしに FreeHGlobal に得た変数を渡していたが、自分の環境ではコンパイルエラーになったので付け足した。

あと、コンパイルオプションとして “/clr:oldSyntax” を付けないといけないと書かれていたが、 “/clr:pure” でも特に問題ないので気にしないことにした。