MSVC PlatformSDK - eiichiromomma/CVMLAB GitHub Wiki

(MSVC) PlatformSDK

DirectShowやOpenGLが含まれている

※[[Windows/VisualC/WindowsSDK)Windows SDK が最新らしい。DirectShowに関してはビルドが楽になった。(注:動作確認は殆どしてない)

Platform SDKの導入

Download Center で「Platform XP」とか「Platform 2000」とか「Platform 98」とかで検索すると直ぐに出てくる。

複数台への導入の場合はここでも"Windows Server 2003 SP1 Platform SDK Full Download"のようにFull Downloadと書かれている方を持ってくる。 単一マシンの場合はネットインストールの方が圧倒的に速い。

インストールはCustomがデフォルトとなっており、その理由はx86以外にIA64やAmd64用のツールも含まれているためで、必要ない場合にはインストールリストから外す。

インストール後の設定

スタートメニューの"Microsoft Platform SDK for Windows Server 2003 SP1"->"Visual Studio Registration"にある"Register PSDK Directories with Visual Studio"を実行するとSDKを利用可能な状態にしてくれる。

筈なのだがダメらしい。 インストール先をC:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\にしておく。

手動でやる場合にはVisual C++の"ツール"->"オプション"でVC++ディレクトリを編集する。

DirectShow

釈然としないのだがDirectShowはおまけの扱いのようで、前述の通りSamples\Multimedia\DirectShowに存在する。

Sampleのビルド

必要なDirectShowのライブラリはSamples\Multimedia\DirectShow\BaseClassesにあるのだが、試しに全部ビルドしてみる。 Sampleには何故かソリューションは存在せずMakefileのみ。 Makefileはビルドのルールを記述したファイルで、今回はVCのnmake.exeを使うことになる。 nmake.exeを使うにはプログラムメニューのVCの中にある"Visual Studio Tools"->"Visual Studio 2005 コマンドプロンプト"を実行する。

コマンドプロンプトが起動したら、PlatformSDKに移動して環境変数を追加するコマンドを実行する。

cd PlatformSDK
SetEnv.cmd

次にSamplesに移動して

nmake

とするとビルドが始まるが、コケまくる。

埒があかないのでひとまず目的のMultimedia\DirectShow\Baseclassesに移動する。

Baseclassesのビルド

DirectXのインストール

結局必要らしい。 ダウンロードページ からインストーラを持ってきて、インストール。

ここではc:\DXSDK\に入れる。

atlthunk.libがない

後でエラーが出るので先にatlbase.hを弄っておく。 cannot open file 'atlthunk.lib に載ってた。

/* 以下をコメントアウト
PVOID __stdcall __AllocStdCallThunk(VOID);
VOID __stdcall __FreeStdCallThunk(PVOID);

#define AllocStdCallThunk() __AllocStdCallThunk()
#define FreeStdCallThunk(p) __FreeStdCallThunk(p)

#pragma comment(lib, "atlthunk.lib")
*/
// Heap系に置き換えてみたり 下のIA64はこうなてたからいいかな・・・
#define AllocStdCallThunk() HeapAlloc(GetProcessHeap(),0,sizeof(_stdcallthunk))
#define FreeStdCallThunk(p) HeapFree(GetProcessHeap(), 0, p)

一応情報保護のため引用しておく。

もろもろの変更

ctlutil.hの278行目

変更前: operator=(LONG);
変更後: LONG &operator=(LONG);

atl関連およびafx関連のincludeが無いエラーはコマンドプロンプトで以下のコマンドを実行

set INCLUDE=%INETSDK%\Include\atl;%INETSDK%\Include\mfc;%INCLUDE%

makefileの1行目に

INCLUDE=$(INCLUDE);C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\atl;C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\crt;C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\mfc

でも良い。これは後のサンプルでもしばしば使う

outputq.cppでiDoneが定義されてない(forループの中でのみ有効の筈が外で使おうとしてコケる(ループ直後の一行だけはOKなそうで。VC++の実装がおかしいらしい))。outputq.cppの635行目

変更前: for(long iDone = 0;
変更後: LONG iDone = 0;
        for(iDone = 0;

winutil.cppでCountが定義されてない(↑と同じ理由)。winutil.cppの2093行目

変更前: for (UINT Count = 0; Count < Result; Count++){
変更後: UINT Count = 0;
        for (Count = 0; Count < Result; Count++){

wxdebug.cppの564行目。staticだけの宣言だと暗黙に宣言してくれることを期待しているようだが、前後のソースを探して適切な型で宣言する。

変更前: static g_dwLastRefresh = 0;
変更後: static DWORD g_dwLastRefresh = 0;

再度nmake

で、やっとビルドが通った。

link -lib /OUT:XP32_DEBUG\strmbasd.lib /MACHINE:i386 /NODEFAULTLIB
XP32_DEBUG\amextra.obj        XP32_DEBUG\amfilter.obj       XP32_DEBUG\amvideo.obj
 XP32_DEBUG\combase.obj        XP32_DEBUG\cprop.obj          XP32_DEBUG\ctlutil.obj        XP32_DEBUG\ddmm.obj           XP32_DEBUG\dllentry.obj       XP32_DEBUG\dllsetup.obj       XP32_DEBUG\mtype.obj          XP32_DEBUG\outputq.obj
XP32_DEBUG\pstream.obj        XP32_DEBUG\pullpin.obj        XP32_DEBUG\refclock.obj       XP32_DEBUG\renbase.obj        XP32_DEBUG\schedule.obj       XP32_DEBUG\seekpt.obj         XP32_DEBUG\source.obj         XP32_DEBUG\strmctl.obj
XP32_DEBUG\sysclock.obj       XP32_DEBUG\transfrm.obj       XP32_DEBUG\transip.obj        XP32_DEBUG\videoctl.obj       XP32_DEBUG\vtrans.obj         XP32_DEBUG\winctrl.obj        XP32_DEBUG\winutil.obj        XP32_DEBUG\wxdebug.obj
XP32_DEBUG\wxlist.obj         XP32_DEBUG\wxutil.obj strmiids.lib
Microsoft (R) Library Manager Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.

Players\Texture3D9のビルドに挑戦

makefileの1行目に

INCLUDE= $(INCLUDE);C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\atl;C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\crt

を突っ込む。あとはnmake。

ちゃんとDirect3Dで描画した円筒にビデオがテクスチャマッピングされる。

GLUTの導入

OpenGL自体はPlatform SDKに含まれているが、GLUTは別なのでNate Robins - OpenGL - GLUT for Win32 から持ってくる。 zipを解凍したら

  1. glut.h : PlatformSDK導入先\Include\glの中
  2. glut.lib : PlatformSDK導入先\Libの中
  3. glut.dll : Windowsフォルダ\system32の中

へそれぞれ移動する。

その他よくあるエラー

定義されていない識別子です

このエラーが殆どと言って良い程発生する。 大抵ループやら中括弧内で定義された変数を、その外で使おうとしているので、適応範囲が広がるように変数を定義してやると動く。

Hcrtfがない

Sampleをビルドして暫くするとHcrtfが無いというエラーが発生する。 このHcrtfが何者か調べると、ヘルプファイルのコンパイラらしい。 そういえば昔にWindowsアプリを作ったときに使った記憶がある。

調べてみるとDownload details: Windows 95 Help Authoring Kit: Microsoft Help Workshop 4.03 にあるようだ。 DLしてインストールしてみる。 古めかしいインストーラだが一応インストールできたのでHcrtf.exe、Hwdll.dllがあるディレクトリを環境変数PATHに加えるか、ファイルそのものをPlatformSDK\Binにでもコピーしておく。

atlsd.libかatls.libがない

2003 .NET限定の解決法なのか、今度は不要。 Makefile内のatlsd.libとatls.libの行を削除するだけでビルドは通った。