今回はライブラリの中から使っている例を見てみます。取り上げるのはEnvironmentクラスの中のCurrentDirectoryプロパティです(一部改変してあります)。
まずはGetterのほうからです。
Static Function CurrentDirectory() As String
Dim size = GetCurrentDirectory(0, 0)
Dim p = malloc(SizeOf (TCHAR) * size) As PCTSTR
GetCurrentDirectory(size, p)
CurrentDirectory = p
free(p)
End Function
Dim size = GetCurrentDirectory(0, 0)では必要なバッファの大きさを得ています。次にメモリを確保します。ここではWindows APIを相手にしていますから、pはTHCARへのポインタとしています。そしてこのpに対してGetCurrentDirectoryでカレントディレクトリを取得してから、String型であるCurrentDirectoryへ代入し、pの指すメモリを解放して関数を抜けています。
StrCharとTCHARは異なる場合があるので、真面目にやるならZeroStringなどでメモリを確保してAPI関数からString型変数に直接書き込んでもらう手法は、真面目にやるなら使えません。
さてSetterです。
Static Sub CurrentDirectory(cd As String)
SetCurrentDirectory(ToTCStr(cd))
End Sub
こちらは滅法簡単でToTCStrで文字の種類を合わせてやっているだけです。
このようにまじめにTCHAR/StrCharの状態がどのようになっていても動くコード書くつもりならこのようにするとよいということです。ただ基本的には全てStringで扱うライブラリを使用し直接APIを使うことがなるべく無いようにしますというよくある文面で締め括ります。
スポンサード リンク |