char wchar_t BSTR 文字変換テスト

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 文字変換テスト