[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