> a = "う"
これが良くないです。
これによって,aはcallocで確保したメモリではなく,"う"を指すことになるのでfreeでエラーになってしまうのです。
正しくはlstrcpy(a, "う")などとします。C++(というよりC)と変わりません。
ただstrcpyが無いのでWinAPIのlstrcpyを使っているだけです。
また、String型を使うとこうなります。
メモリ確保にはZeroString,解放は自動で行われると考えればよいです。
ただしZeroStringは文字列終端の\0文字の分,引数より1バイト多くメモリ確保します。
StrPtrはString型の変数から文字列の先頭を指すポインタ (*Byte)を返す関数です。
コード: 全て選択
Dim a As String
a = ZeroString(sizeof(Byte) * 255)
lstrcpy(StrPtr(a), "う")
Msgbox hMainWnd, a
ただし,この状態ではaにLen関数を使用したときに255を返し,文字列連結などが正常に行えない(ように見える)ことになるはずです。
きちんと処理するにはString型文字列の長さを保持している部分を書き換えてやる必要があります。それは現在のところこんな感じになります。
コード: 全て選択
SetDWord(StrPtr(a) - SizeOf (DWord), lstrlen(StrPtr(a)))