FrontPage | changes | index | create | search | preferences

Platform SDK

Last-Modified: Sat Dec 20 05:48 2014; Revision: 1.53; by momma
edit | copy | diff | history | raw
  1. Platform SDKの導入
  2. インストール後の設定
  3. DirectShow
    1. Sampleのビルド
  4. Baseclassesのビルド
    1. DirectXのインストール
    2. atlthunk.libがない
    3. もろもろの変更
    4. 再度nmake
  5. Players\Texture3D9のビルドに挑戦
  6. その他よくあるエラー
    1. 定義されていない識別子です
    2. Hcrtfがない
    3. atlsd.libかatls.libがない

DirectShowやOpenGLが含まれている

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

[edit]

Platform SDKの導入

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

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

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

[edit]

インストール後の設定

スタートメニューの"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++ディレクトリを編集する。

[edit]

DirectShow

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

[edit]

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に移動する。

[edit]

Baseclassesのビルド

[edit]

DirectXのインストール

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

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

[edit]

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)

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

[edit]

もろもろの変更

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;
[edit]

再度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.
[edit]

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で描画した円筒にビデオがテクスチャマッピングされる。

http://www.eml.ele.cst.nihon-u.ac.jp/~momma/img/texture3d.jpg

[edit]

その他よくあるエラー

[edit]

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

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

[edit]

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にでもコピーしておく。

[edit]

atlsd.libかatls.libがない

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

[edit]

Momma's wikiはgithub内へ引っ越す予定です

Powered by WiKicker

日本大学理工学部へ 電気工学科へ 門馬研究室へ