Haskell から COM を呼ぶ場合 HaskellからSJISに変換した後に MultiByteToWideChar、 WideCharToMultiByteを使用していましたが、Haskell はUcs4、COMはUTF16を使っていて、日本語で使う分には文字コードを変換しなくても良いはずです。
そこで、WideCharToMultiByteを使用しないでBSTRを作るために以下のサイトを参考にchar <=> wchar_t <=> BSTR 文字変換テストをしてみました。
/* gcc mbs.c -o mbs -loleaut32 */ // http://simd.jugem.jp/?eid=120 #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <locale.h> int main(void) { char *ms = "char <=> wchar_t <=> BSTR 文字変換テスト"; char newms[100]; wchar_t ws[100]; int len; BSTR bstr; setlocale( LC_CTYPE, "jpn" ); len = mbstowcs( ws, ms, 100 ); printf( "ワイド文字数は %d文字\n", len ); printf( "ワイド文字は %ls\n", ws ); len = wcstombs( newms, ws, 100 ); printf( "マルチバイト文字長は %dバイト\n", len ); printf( "マルチバイト文字は %s\n", newms ); /* ここでワイド文字列からBSTRを作ります。 */ bstr = SysAllocString(ws); printf("BSTR文字長は%d\n",SysStringLen(bstr)); len = wcstombs( newms, bstr, 100 ); printf("BSTR文字は %s\n", newms); SysFreeString( bstr ); return 0; }
PS C:\HaskellPlatform\test\BSTR> gcc mbs.c -o mbs -loleaut32 PS C:\HaskellPlatform\test\BSTR> ./mbs ワイド文字数は 34文字 ワイド文字は char <=> wchar_t <=> BSTR 文字変換テスト マルチバイト文字長は 41バイト マルチバイト文字は char <=> wchar_t <=> BSTR 文字変換テスト BSTR文字長は34 BSTR文字は char <=> wchar_t <=> BSTR 文字変換テスト