[MSDN ライブラリ 2001 年 10 月] +[技術文書] +[技術文書 (日本語)] +[ビジュアル ツール] +[Visual Basic] +[Visual Basic] +[Microsoft Visual Basic で使用する DLL の開発に関する情報]
この為、GetVersionExA() のような文字列とサイズをパラメータで渡すAPIを使用する
場合は注意が必要となる。
UNICODEの文字列は1文字を2バイトとして取り扱う為、LenB() 関数を使用し
バイト数を求めると、実際の文字数の倍のサイズが返って来る。
GetVersionExA() では、構造体を渡すときに、構造体のサイズ dwOSVersionInfoSize
を指定する。
しかし、このサイズを LenB() 関数で求めようとすると、String 型の部分を
1文字2バイトとして計算してしまう為、以下のような構造体定義をしてしまうと、
--------------------------------------------------------------------------
Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128 ← UNICODEの為、LenB()では2倍のサイズとなる。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
End Type
--------------------------------------------------------------------------
Dim info As OSVERSIONINFO
dwOSVersionInfoSize
= LenB( info ) … 4 + 4 + 4 + 4 + 4 + (128)*2 … 276
(本来は、4 + 4 + 4 + 4 + 4 + 128 … 148 指定したい。)
となり、本来、関数に渡すべきサイズが設定できず、関数がエラーになってしまう。
これを回避する方法として、以下のように文字列の部分にByte配列にする方法もある。
--------------------------------------------------------------------------
Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion(127) As Byte … LenB() では正しい値が取得できる。
~~~~~~~~~~~~~~~~~~~~~~~~~~~
End Type
--------------------------------------------------------------------------#access