Visual C++での<vfw.h>ヘッダファイルのインクルード法

 作業環境:Windows2000, ++ 6.0, MFC AppWizard, MDIor SDI)アプリケーション
 作成プロジェクト名:Capture

 これらのプログラムは私が作成して使用しているプログラムですが、実際にお客様方がこれらをコンパイルや実行した際に何らかの悪影響が生じたとしても、管理人・九本麻有巣は一切の責任を負いかねます。御利用は、各人の責任を以ってお願い致します。

 さて、ビデオキャプチャカードを所有の皆様。VC++があればお手軽に入力映像のキャプチャや、静止画のファイル保存等を行なえる事を御存知でしょうか?Windowsではそう言ったキャプチャ関連の関数をAPIで装備しています。そのAPI関数の名前がVideo for Windows(以下:VFW)。これを使えば、入力画像を自分が指定したサイズのウィンドウで閲覧したり、クリック一つで「ここだ!!」と言う瞬間の映像を激写して静止画として保存する事が可能となります。
 まァ、そこいらへんのプログラムは、ネットで検索すればサクサクと引っ掛かってくれるので、素人プログラマーの俺は口出ししないとして、それよりも、です。VC++ 6.0では、知らずにVFWを使おうとすると、問答無用でブチ当たる壁があります。それがリンクエラー。まァ、取り敢えず下記のプログラムを見て下さい。これは、ただ入力画像をウィンドウに垂れ流すだけの最も簡単なキャプチャソフトの一例です。


#include <vfw.h>      // VFWを使用するヘッダファイルをインクルード

CCaptureView::OnDrow(CDC* pDC)
{
    :
    :
  HWND capWnd;    // キャプチャウィンドウのハンドル

  capWnd = capCreateCaptureWindow(  // キャプチャウィンドウを作成するVFW。戻り値はキャプチャウィンドウのハンドル。 
      "Capture window",             //   キャプチャウィンドウの名前
      WS_VISIBLE | WS_CHILD,        //   キャプチャウィンドウのスタイルを指定。
      0, 0,                         //   キャプチャウィンドウを表示する座標(ウィンドウの左上端の位置座標を指定)
      320, 240,                     //   キャプチャウィンドウの幅、及び高さを指定[pixel]
      this->m_hWnd,                 //   キャプチャウィンドウを作成するクライアント領域を指定。
      100);                         //   子ウィンドウIDを指定。正直、私にはこれが何か解かりません。
  capDriverConnect(    // キャプチャウィンドウとキャプチャデバイスを関連付けるVFW。
      capWnd,          //   デバイスと関連付けるウィンドウのハンドル。作成したキャプチャウィンドウを指定。
      0);              //   キャプチャドライバのインデックスを指定。複数のデバイスを装備している際に使用。単一のデバイスなら0を指定。
  capOverlay(   // キャプチャ画像をオーバーレイ表示するVFW。
      capWnd,   //   キャプチャウィンドウのハンドルを指定。
      TRUE);    //   TRUE指定でオーバーレイを可能にする。FALSE指定でオーバーレイ表示は不可。
    :
    :
}

 プログラム的にはこれでOK。後はこれをコンパイルして実行すれば、晴れて自作のキャプチャソフトが完成する!!
 しかし、ここで落とし穴がある。それは何かと問われると、コンパイルエラーが発生するのだ。エラー内容は下記の通り(微細な差異は多々にあります)。

CaptureView.obj : error LNK2001: 外部シンボル "_capCreateCaptureWindowA@32" は未解決です
Debug/Capture.exe : fatal error LNK1120: 外部参照 1 が未解決です。
link.exe の実行エラー

 因みに、片仮名部分は全て半角カナ文字です。余談ですね。
 ワケが解からず研究室の先輩に相談してみたところ、どうもコンパイルの際に"vfw.lib"(VFWが収納されているライブラリ)を読みに行こうとしているのだけど、ヘッダファイルで何らかの不都合があって(説明してもらったけど、私の脳味噌では理解不能な上に記憶不能でした)"vfw.lib"を読む前に蹴られてしまい、結局読めずじまいになってしまっているらしい。つまり、このままだとVFWが使えない。要約すればそう言う事。
 さて、ではどうすればVFWを利用可能に出来るのであろうか?解法はとても簡単です。しかも、二つもある。たが、これを知るまでに一週間近いロスを生じてしまった苦い経験を持ちます。ま、四の五の言わず解法を言いますと、
 まず一つ目。


#pragma comment(lib,"vfw32.lib")  // "vfw32.lib"へのアクセスを明示的に示す。これで"vfw.lib"にもアクセス可能に。

 この一行をソース中のどこか適当な位置に挿入するだけ。これでVFWを使用可能になり、コンパイルも通って万々歳。
 そして、二つ目。研究室の先輩が言うには、「こっちの方が良いと思う(少し自信無さげ)」らしい。理由は……覚えてません。
 で、そのやり方は、ツールバーの
[プロジェクト(P)]->[設定(S) Alt+F7]
 と選択してプロジェクト設定ダイアログを出す。そして、[設定の対象(S)]にて『全ての構成』にセット。アンド[リンク]タブを選択して[オブジェクト/ライブラリモジュール(L)]のボックス内に手打ちで『vfw32.lib』と入力(『』は要りません。念の為)。以上で終了。
 と、以上で「VC++ 6.0での<vfw.h>ヘッダファイルのインクルード法」の説明は終わりです。もっと詳しく知りたい人は、質問して下さっても結構ですが、基本的に私は素人です。答えられない可能性は多分にありますので、期待せずに駄目モト気分でお願い致します。

 PS:ところで、VFW APIMSDNライブラリにあります。全部英語ですが(現在のversionはどうか知らないケド)、根性で調べれば解かります。私は根性で和訳しました。おかげで余計な知識までGETできました。ま、全部訳すのに一ヶ月近くかかったけどね(笑)。

Visual C++ プログラミング講座

Return to Top-page    Return to Extra-Index