プログラミング

Visual Basicで
コンソールプログラムの開発

北山 洋幸


 Visual Basicは,GUIプログラムの開発に適したRADツールです.このため,コンソールプログラムを開発したい場合,C++BuilderやVisual C++を使用していました.
 Visual Basicで開発した資産を使ったコンソールプログラムを開発したい場合もありましたが,今までは,Visual Basicでコンソールプログラムを開発しようとは考えませんでした.
 しかし,Visual Basicで作った資産を,Visual C++に書き直すのも面倒なので,Visual Basicでコンソールプログラムを開発することにトライしたところ,案外,簡単に開発できることがわかりました.

 プログラムのダウンロードはこちらから

環境
Windows 9xまたはWindows NT 4.0.
コンパイラ
Visual Basic 6.0 Professional Edition以上

プログラムの構造

 プログラムは,通常のフォームを持ったプログラムです(図1).しかし,フォームを表示しないと同時に,すべての処理をForm_Loadの部分に記述します.Form_Loadの部分に記述しますので,フォームの表示は,表示/非常時に関係なく,使用者には見えません.
 けれども,プログラムの終了時に,短時間の間使用者の目に触れる可能性があるので,プロパティを非表示にしてあります.詳しくはプログラムの説明を参照してください.

プログラムの開発

 まず,フォームを示します(図2).単純に作るのも面白くないので,いくつかのコマンドを受け付けて,ネットワークの状態を表示するようにしました.
 ネットワークの情報を得るために,Winsockコントロールをフォームに配置します.このコントロールは標準のコントロールではありません.そのままではコントロールを使うことができないので,「プロジェクト」→「コンポーネント」を選びます(図3).
 「コンポーネント」ダイアログで,「Microsoft Winsock Control」をチェックします(図4).
 すると,ツールボックスに,Winsockコントロールが現れます.このコントロールは,通常の標準コントロールのように使用できます(図5).
 使用者には,コンソールプログラムに見せますので,フォームは単純にプログラムを載せておく場所として使用します.ですからフォームを使用者に見せないようにします.VisibleプロパティをFlaseにすることで,フォームを使用者が短時間でも目にする機会はなくなります(図6).
 なお,変数の宣言を強制するオプションを,あらかじめオンにしておきます.このオプションをオンにしておくと,次回からプログラムの先頭に「Option Explicit」が挿入されます.「Option Explicit」が入っていると,変数の宣言なしに変数を使用することはできません.これは,単純なタイプミスなどのケアレスミスを回避するのに役に立ちます.
 ただ,既に開いているプロジェクトには「Option Explicit」が挿入されませんので,気をつけてください(図7).

プログラムの流れ

 プログラムの流れを図8に示します.フォームのロード時に,コンソールを開き,ループに入ります.このため,使用者には,コンソールプログラムと映ります.
 Visual Basicでコンソールプログラムを作るのは難しいため,ほとんどWindows APIを利用します.コンソールを開くのにAllocConsole APIを,stdinやstdoutのハンドルを取得するのにGetStdHandle APIを使います.また,コンソールへの入出力には,ReadFileとWriteFile APIを使用します.Windows APIとVisual Basicの文字列処理に違いがあるため,コンソールとのやりとりには,多少の工夫が必要です.

Vb-1.jpg (27662 バイト)

Win32api.txtを活用

 Visual Basicのアプリケーション内で外部プロシージャを宣言すると,Windows APIにアクセスすることができます.\Microsoft Visual Studio\Common \Tools\Winapiにあるファイル,Win32api.txtにはよく使われるWindows APIプロシージャの宣言が格納されています.このファイルの関数や型などの機能は,Visual Basicにコピーするだけで利用することができます.Win32api.txtのプロシージャの表示およびコピーは,APIビューアを使うのが便利です.

● API ビューアの使用方法
 APIビューアは,テキストファイルまたはMicrosoft Jetデータベースに含まれている宣言,定数および型の一覧を表示します.必要なプロシージャを見つけたら,クリップボードにコピーして,Visual Basicアプリケーションに貼り付けることができます(図9).

Vb-2.jpg (30114 バイト)

 一般に,APIビューアではWin32api.txtを読み込んで,必要なWindows APIを見つけます.APIビューアを「スタート」→「プログラム」→「Microsoft Visual Studio 6.0」→「Microsoft Visual Studio 6.0ツール」→「APIビューア」で起動し,「ファイル」→「テキストファイルの読み込み」で,Win32api.txtを読み込みます.あるいは,「アドイン」メニューで「アドインマネージャ」を選択し,API Viewerをロードします.「アドイン」メニューで「API ビューア」をクリックします.そうするとAPIビューアが立ち上がります.APIビューアを頻繁に使うなら,「アドインマネージャ」で「ロード方法」の「起動時にロード」を選択しておけば,毎回APIビューアを起動する手間が省けます.
 APIのDeclareは,標準モジュールで行う場合と,フォームモジュールで行う場合は異なっています.Microsoft Visual Studio 6.0の「APIビューア」では,PrivateとPublicをラジオボタンで選べるようになりました.今回はフォームの中で使いますので,Privateを選んでおきます.
 以前に比べればかなり改善されましたが,Win32 api.txtはタイプミスなどもあり,信頼できない点もあります.C++の環境をお持ちならヘルプ,あるいは,SDKや市販のAPIマニュアルなどで確認が必要です.また,使用法に従い,読み込んだDeclare文を修正したほうが,使いやすい場合もあります.今回も,一部の機能を使用しないため,読み込んだDeclare文をリスト1のように修正します.
 AllocConsoleがコンソールを開くAPIです.AllocConsole APIは,呼び出したプロセスに新しいコンソールを割り付けます.コンソールをいったん開いた後はフォームロードを抜けず,キーボードの入力を待ちます.このプログラムは3つのコマンドに対応しています(表1).
 これ以外のコマンドが入力された場合,単純に無視します.

以下略


copyright 1999 北山 洋幸