I am beginner! - Windows APIを初めて使う方たちへ(ページ2)

使うための宣言方法を勉強する

Windows APIをVBから使うためにはそれをVBに宣言しなければなりません。
VBにおけるAPIの宣言の仕方は非常に簡単です。
APIの宣言方法
[Public | Private] Declare Sub name Lib "libname" [Alias "aliasname"] [([arglist])]
Public | Private] Declare Function name Lib "libname" [Alias "aliasname"] [([arglist])] [As type]
ってVB5のヘルプではなってました。いつも見る気が起きないんですが....。

ということで、当サイトのページを使って説明してみたいと思います。


使う関数はGetWindowsDirectory()関数というものを使います。
この関数はWindowsディレクトリがどこにあるのかを教えてくれる関数です。

この関数の説明のページ(上図)から宣言方法の部分だけを抜き出してみました。

順番に見ていきます。
ちょっと長いですががんばって読んでください。



@Declare: これはお約束。VBの以外の関数を使うときに必ずつけます。

AFunction: Functionとは戻り値を返すもの。
つまり関数を呼び出したら、なにか値が返ってくることを意味します。
この値のことを「戻り値」といいます。

ここがSubとなっていたらSubroutineの略。
つまり呼び出しを行っても値を戻しません。

BGetWindowsDirectory: ここはVBのプログラム内での名前を付けます。
通常は関数の名前を書きます。大文字・小文字は区別されます。

CLib "kernel32.dll": 呼び出すAPI関数がどのファイルに含まれているかを示しています。
普通のVBのサンプルでは「.dll」というのは書いてありません。
「.dll」を書かないと、VBは「.exe」か「.dll」を探します。

ですが、当サイトではあえてそれを明示的に「.dll」まで書いています。
それは、その方が誰が見てもわかるからです。あと、私の好み。
「.dll」は書いても書かなくてもいいですが、
たまに「.drv」などがあるので注意してください。

DGetWindowsDirectoryA:ここにはAPI関数の正式な名前を書きます。
「A」というのは「ANSIコードページ」の意味です。
「W」というのもあります。注意してください。

EByVal: ByValとは「値渡し」の意味です。
「変数の中身をAPI関数に教える」という働きをします。
ByRefというのもあります。
ByRefは「参照渡し」といいます。
参照渡しとはその変数のアドレスをAPI関数に教えます。
ByValもByRefもない場合は、ByRefと同じです。

FlpBuffer: ここはVBのプログラムの中での引数の名前です。
当サイトでは、Microsoftが提供している引数名と違う名前を
つけていることが多くあります。
それはその引数の使われ方などから判断して、代えています。
ここは別に自分の好きな名前をつけても動作には影響しません。

GAs Long: どのデータ型でAPI関数にデータを渡すのかを指定します。
ここはVBのヘルプを参考にしてください。よく使われるものを示しておきます。
Byte : 0〜255 : 1バイト
Integer : -32,768 〜 32,767 : 2バイト
Long : -2,147,483,648 〜 2,147,483,647 : 4バイト
String : 文字列 : 10バイト+文字列の長さ
String * 255: 文字列(固定長) : 掛けた数字の長さのバイト数
(255は255バイトの意味。255以外の数字もできる。)

H)As Long: どのデータ型で戻り値が戻ってくるのかを指定します。
Aで「Sub」で宣言した場合、必要ありません。



Bには自分の好きな名前を付けることができます。
例えば

Declare Function WindowsFolder Lib "kernel32.dll" Alias "GetWindowsDirectoryA" _


なんてこともできます。
しかし、他の人がプログラムを見たときに分かりにくいので
なるべくやめましょう。
また、Aliasをなくして

Declare Function GetWindowsDirectoryA Lib "kernel32.dll" _

ということもできますが、普通はあまりこうゆうことはしません。
自分でプログラムを作るときに面倒なときだけこうゆうことをしますが。

なお、Declareの前に「Private」か「Public」を付ける事があります。
省略されているときは「Public」です。

これはその関数の適用範囲なのですが、簡単に言うなら、
Formとかの場合は、「Private」、モジュールに記述する場合は「Public」になります。
これは実際にプログラミングをしていれば覚えるでしょう。

とりあえず使ってみる。
下にこのGetWindowsDirectory()関数を使ったプログラムを示します。
フォームは好きなようにデザインしてください。
フォームをデザインしたら、次のソースコードを入力してください。

'Windowsディレクトリのパス名を取得する
Private Declare Function GetWindowsDirectory Lib "kernel32.dll" Alias "GetWindowsDirectoryA" _
    (ByVal lpBuffer As String, ByVal uSize As Long) As Long
Private Const MAX_PATH = 260                              'パスの最大長

Private Sub Command1_Click() 'Windowsディレクトリを取得する Dim lpBuffer As String * MAX_PATH, rc As Long rc = GetWindowsDirectory(lpBuffer, Len(lpBuffer)) MsgBox "Windowsディレクトリ:" & lpBuffer End Sub
        実行結果
サンプルを置いておきます。動作を確認してみてください。
ダウンロード(GetWindowsDirectory.lzh 1.07KB)