Visual Basic 関連情報

Visual Basic 6.0

Visual Basic .NET

Visual Basic 6.0 からの移植

Win32API

メッセージフック

VBでWin32APIに渡す構造体を定義するときの注意点

  • 特に注意しなければならないのは次の2点。
    • VB では文字列(String型)を内部的に UNICODE(BSTR型)で取り扱う。
    • VB ではString型を LPSTR に渡す場合、自動的に UNICODE→ANSI の変換が行われる。
      この為、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
      --------------------------------------------------------------------------

COM 関連情報

COM の使い方

コンポーネント開発

ランタイムのバージョン

コントロールの使い方

インストーラーに関する情報

その他

Visual Basic 業務アプリ構築法


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-02-27 (土) 14:20:03 (5402d)