Visual Basic 6.0 中級講座
VB6対応

 

Visual Basic 中学校 > VB6 中級講座 >

第1回 APIを使う

 

「VBでできないことはあるのか?」というのは私がはじめてVBをさわった時からの疑問でした。誰でも一度はこの点について考えてみたのではないですか? VBの機能だけに限定して考えるとできないことはあります。たとえば、Windowsを終了させることはできません。MIDIやWAVEを演奏することもできません。

しかし、「VBの機能」の意味を拡大解釈すれば今挙げた例はすべてVBでもできます。どのように拡大解釈するのかというと「VBからWindowsに命令してWindowsの機能を使う」と言う意味も「VBの機能」に含めると言うことです。Windowsは外部のプログラムから命令を受けることを想定して予め命令受付の窓口とも言うべき物を備えています。その仕組みこそがAPI(またの名をシステムコール)と呼ばれる物です。

この回の要約

・API関数を使うとVB標準の機能ではできないいろいろなことができるようになる。

・最も簡単なAPI関数 GetTickCount() を使ってWindowsが起動してからの経過時間を取得する方法

・API関数を使うには Declareキーワードを使ってその関数を宣言する。

 

1.APIを使う心構え

 

APIはすべて関数の形を取ります。ただし、VBと違って戻り値のない関数も含みます。

また、APIはVBから利用できるとはいえ VBではない ので使用にあったてはいくつかの心構えが必要とされています。その心構えを載せておきましょう。

掟1    APIはどうしても必要な場合の他は使ってはならない。

掟2    APIを使ったプログラムは実行する前に保存すべし。

掟3    APIを試行錯誤で使ってはならない。

掟4    APIを使う者はWindowsをフリーズさせる危険もあると心せよ。

「・・・ならない」とか「・・・すべし」とか少し偉そうに書いてみましたがだいたいこれらのことは守っておいた方がいいです。APIはVBじゃないのでVB感覚で扱うと危険な場合もあります。しかし、APIを巧みに使えばすばらしい機能を実装することができる場合もあります。とにかく、まずAPIとはどういったものか知ることが先決でしょう。

 

2.宣言

 

では、手始めに簡単に扱われると思われる部類のAPIの使い方を解説しましょう。ここで解説するのはWindowsを起動してからの時間を取得する方法です。VBでもTimer関数(タイマー)を使って細かい時間を取得することができるのですが、このTimer関数とこれから紹介するGetTickCount関数(ゲットティックカウント)では少し異なるところがあります。VB標準のTimer関数は午前0時からの経過秒を返すのに対し、GetTickCount関数はWindowsを起動してからのミリ秒(1秒=1000ミリ秒)を返します。こう書くとGetTickCount関数の方が精度が高いように思われるかもしれませんが、Timer関数も小数点以下の値まで返してくるので一概にどちらが優秀かはわかりません。場面場面によって使い分けることになるでしょう。

さて、APIを使うには必ず独特の宣言が必要です。その宣言は Declare Function キーワードを使って行います。また、API関数の適用範囲に応じてこの前にPrivateまたはPublicを付加します。

さらに、@この関数をエクスポートしているDLLの名前、A実際のエントリの名前、B引数、C戻り値を正確に記述する必要があります。ここが難しいところです。これらを正確に宣言するのはなかなか大変です。まず、情報が不足しているとお考えでしょう。この点については後で解説することにして今はGetTickCount関数の宣言を完成させます。

APIを使うための宣言に必要なもの
API関数であることを示す宣言 Declare Function
API関数の名前 GetTickCount
API関数をエクスポートしているDLLの名前 Lib "kernel32"
実際のエントリ名 Alias "xxxxA"   (→GetTickCountには必要ない)
引数 (GetTickCountには引数はない)
戻り値 As Long

■API関数を使うために必要な情報

@のエクスポートしているDLLというのはその関数を記述しているDLLファイルのことです。API関数も誰か作った人がいるわけで、その関数をプログラムしたファイルもあるわけです。そのファイルの名前を指定すればよいわけです。API関数は大変たくさんあるのですべてが1つのファイルにまとまっているわけではありません。代表的なファイルは User32.dll   Kernel32.dll   Gdi32.dll   Shell32.dllなどです。これらのファイルはWindowsフォルダにあるSystemフォルダ(NTではSystem32フォルダ)に入っています。今回使うGetTickCount関数が記述されているのは Kernel32.dll です。

A実際のエントリの名前とは、その関数の本当の名前のことです。我々が使おうとしているGetTickCount関数の本当の名前はそのままGetTickCountです。関数によっては本当の名前と通用している名前が違うことがあるのでこのような指定ができるようになっています。文字列を扱う関数には文字コードの違いによって本当の名前は異なるのに通用している名前は1つという場合があります。そのようなときにこの機能を思い出してください。このほかにも本当の名前と宣言する名前を変える理由はあるのですが今回は深く立ち入らないことにします。

B、Cの引数と戻り値はVBの関数でも用いるのでここでは特に説明を必要としないでしょう。

さて、以上の点をすべて勘案するとGetTickCount関数の宣言は次のようになります。

Private Declare Function GetTickCount Lib "kernel32" () As Long

この関数は引数がないので楽ですね。ここまでが大変ですが宣言さえしてしまえば普通のVB関数のように利用するだけなので後はさほどでもありません。

 

3.GetTickCount関数の説明

 

少しこの関数について補足しておきます。といってもそれほど複雑な関数ではないので、失礼してMSDNライブラリにある説明をそのまま掲載しましょう。

システムを起動した後の経過時間を、ミリ秒(ms)単位で取得します。この時間は、システムタイマの分解能による制限を受けます。システムタイマの分解能を取得するには、GetSystemTimeAdjustment 関数を使います。

(中略)

経過時間は DWORD 型で保存されています。システムを 49.7 日間連続して動作させると、経過時間は 0 に戻ります。

より高い分解能のタイマが必要な場合は、「multimedia timer」(マルチメディアタイマ)または「high-resolution timer」(高分解能タイマ)を使います。

Windows NT/2000:コンピュータを起動した後の経過時間を取得するには、レジストリの HKEY_PERFORMANCE_DATA キー内の System Up Time カウンタを取得します。この値は、8 バイトです。詳細については、MSDN ライブラリの「Performance Monitoring」を参照してください。

はじめての人はきっとこの説明を見てもよくわからないでしょう。というのもこの説明はC言語を想定して書かれているからです。たとえば途中で出てくる DWORD型 はVBでいうと Long型 に該当します。

 

4.実装

 

それでは、プログラムを完成させます。ただ経過時間を表示するだけでは面白くないのでついでにあなたのパソコンの性能を測定するプログラムを書いてみましょう。

とはいってもそれほど難しいことはやりません。計算が遅いといわれている浮動小数点演算を繰り返させてどのくらいの時間で計算が終了するのかを測るだけです。計算開始前にGetTickCount関数でWindowsが起動してからのミリ秒(以下単に「ミリ秒」と書く)を取得し、計算終了後にもミリ秒を取得し、最後に2つのミリ秒を引き算すれば計算にかかった時間が出るという寸法です。

1回の測定では誤差もあるでしょうからループをまわして10回測定することにします。

こんなプログラムはすぐかけますね。次のようになります。

 コントロール名  種類  説明
 List1  ListBox  計算結果を表示する
 Command1  CommandButton  計算を開始する

 

Private Declare Function GetTickCount Lib "kernel32" () As Long

Private Sub Command1_Click()

    Dim StartTime As Long '開始時間
    Dim EndTime As Long '終了時間
    Dim M As Long
    Dim K As Long
    Dim X As Double 'ダミー計算用


    For M = 1 To 10

        StartTime = GetTickCount

        For K = 1 To 10000000

            X = X * 1.01
            X = X / 1.01

        Next K

        EndTime = GetTickCount

        List1.AddItem EndTime - StartTime
        DoEvents

    Next M

End Sub

みなさんも実際にやってみてください。見ているだけと実際にやってみるのとでは結構違うものです。

プログラムが終わったら保存してから実行してみてください。ボタンをクリックするとリストボックスに計算にかかった時間が表示されていくことでしょう。

なお、参考までに私のパソコンでかかった時間を掲載しますと、だいたい1062ミリ秒前後でした。だからあれだけの計算でも1秒で終わるということですね。私はつい最近新しいパソコンを買いまして現時点では相当ハイレベルなスペックとなっています(CPU2GHz、メモリ1GB)。ですから普通のパソコンで実行した場合はもっと時間がかかることと思います。

なお、実行中のプログラムを途中で一時停止するには Ctlr + Break(Pause) を押します。計算しているのかとまっているのかわからなくなった場合は確認してみてください。

それで、肝心のAPI関数の使い方ですが、存外 難しくないことがわかっていただけたのではないでしょう。今回は最初ということできわめて簡単なAPI関数を紹介したわけですが……。

 

5.情報収集

 

さて、APIに関する宣言をするために、必要な機能を実現するAPIを探すために一体どういう情報源があるのかを説明します。

まず、「どんなAPIがあってどんな機能を持っているか?」と言う点ですが、はっきり言って経験が一番です。しかしそれだけでは満足な解答ではないでしょう。私が主に利用している情報源は雑誌です。「Visual Basic Magazine」と「日経ソフトウェア」は毎月買っています。他にも書店に行けばAPIの資料となるようないろいろな本が置いてあります。

書籍のほかにインターネットでそれらしいページを当たってみるという手もありますね。最近は検索機能も向上していますのでGoogleあたりで GetTickCount などで検索すればヒットするページがあるのではないでしょうか。ちなみに当Visual Basic中学校はなぜかGoogleにはヒットしません。だいぶ前から申請しているのですが…。(←今はヒットします)

その他にはもちろん MSDNライブラリ です。 たとえば画像を反転させる処理をしたければ、"画像" AND ”反転" で検索すればヒントとなるような情報が得られます。ただし、目的のAPIを探し当てるのは大変です。そもそも目的の機能を装備しているAPIが存在するかどうかも確かではないのですから。

MSDNライブラリをご存じない方もいらっしゃるでしょうか?MSDNライブラリはマイクロソフト社が技術者向けに発行している資料集でVBはもちろんC言語、Java、HTML、Windows、Officeなどについて総計1.5GB以上に上る膨大なドキュメント・サンプル・コラム・チュートリアルなどなどを収録しています。MSDNライブラリをお持ちの方はぜひインストールしてみてください。ただ読んでいるだけでもためになる記事にめぐり合うことでしょう。

MSDNライブラリを入手するには買わなくてはならないのですが、VBやVSを買った方には付録でついてきますので気がついていない方は箱の中を確認してください。CD3枚組くらいですのですぐ気がつきます。

VBの評価版をつかっているけどMSDNライブラリが見てみたいという方は朗報です。マイクロソフト社はなんとWEB上でこのMSDNライブラリを公開しているのです。リンクページからMSDNライブラリにジャンプできますのでぜひ覗いてみてください。けれど、WEB上だと遅くていらいらします。やっぱり自分でもっているのが一番ですね。

MSDNライブラリの情報は3ヶ月に1度ずつ更新されています。

MSDNライブラリの他には APIビューワ をあげておきましょう。これはAPIの機能が分かるものではありませんが名前から機能が想像できるAPIもありますから調べてみる価値はあります。

次に、目的のAPIを探し当てとしても、その宣言をどうすればよいか調べるにはどうしたらよいでしょうか。

これはやはりMSDNライブラリで調べればよいのですが問題があります。API関数に関する説明はVBではなくVC(Visual C++)の観点からなされているのです。そのためわれわれVBプログラマーはどんなに知識があってもVCの知識がないとあまり理解できません。上級のVBプログラマーになるためにはVCもあやつれなくてはいけないのでしょうが、はっきり言ってきついです。

そこで、VBプログラマーにはさきほど紹介した APIビューワ という便利なツールが用意されていることを思い出しましょう。このツールはVBのメニューの[アドイン]から、[アドインマネージャ]を選び、一覧の中から APIビューワ を選びロードすると使用可能になります。実際に使用するときはもう一度[アドイン]を選択してください。

APIビューワを使用するときは最初に[ファイル]メニューから Win32api.txt を読み込んでください。そして、関数を選択して知りたい関数の名前をクリックすれば その関数をVBから使うのに必要な宣言を表示してくれます。

ところが、この便利なAPIビューワは VBの Professional版以上でないとついてこないため 評価版を使っている人やLearning版を使っている人は残念ながら使用できません。 Office2000 のDeveloper版にも付属しているそうです。(また、APIビューワには結構まちがいもあるということです)。

なんだか話が二転三転してしまいましたが、ようするに情報収集は大変だと言うことです。みなさんも有効な情報源を探してみてください。私は必要なAPIの情報が全然見つからないのでくるしまぎれにインターネットの(確かInfoSeek)に APIの名前を入力して検索したらみごとにヒットして 必要な情報の解説あるWebサイトにたどり着いたことがあります。

ここの中級講座でもところどころでAPI関数を使用することと思いますので情報源の1つとしてご活用下さい。