Seaside Laboratory

Posts

Borland C++ Compiler で DirectX 7

BCC には最初から DirectX 関連ファイルが付属しているものの、実際にプログラムをコンパイルをしてみるとまともに動かない。

この BCC に関するトラブルを扱ったページはいくつかあるが、情報が断片的なのでコンパイルが出来るようになるまでかなりの時間を浪費する。環境を再構築する際にまた同じことをするのは嫌だったので、一連の問題と解決策をまとめておくことにした。

問題解決には DirectX 7 の SDK が必要なので、持っていない場合は予めダウンロードしておく必要がある。

この記事を書くにあたり下記ページを参考にした。

dls1.h がインクルードできない

BCC には dls1.h が収録されていないので呼び出すとエラーになってしまう。

エラー E2209 c:\Borland\Bcc55\include\dmusicc.h 20: インクルードファイル 'dls1.h' をオープンできない

DirectX 7 SDK にある同名のファイルを BCC のディレクトリにコピーすれば使えるようになる。

SDK のディレクトリ\include\dls1.h
↓ コピー
BCC のディレクトリ\include

winmm.lib が開けない

BCC 付属の readme.txt の指示に従って作った ilink32.cfg を使うと、Platform SDK 関連のライブラリを読み込めず、エラーになってしまう。

Fatal: ファイル WINMM.LIB が開けません

ライブラリ自体は PSDK ディレクトリに収録されているので、そのパスを末尾に追加すれば使えるようになる。

-L"c:\Borland\Bcc55\lib;C:\borland\bcc55\Lib\PSDK"

dxguid.lib が開けない

BCC には dxguid.lib が収録されていないので GUID を使うプログラムを書くとエラーになってしまう。

Fatal: ファイル DXGUID.LIB が開けません

DirectX 7 SDK にある同名のファイルを BCC のディレクトリにコピーすると使えるようになる。

SDK のディレクトリ\lib\borland\dxguid.lib
↓ コピー
BCC のディレクトリ\lib\PSDK

DirectInput 関連の問題

BCC 付属の dinput.lib は、IDirectInputDevice7::SetDataFormat で使用するグローバル変数が定義されていないので、参照することができず未解決エラーになってしまう。

Error: 外部シンボル '_c_dfDIKeyboard' が未解決
Error: 外部シンボル '_c_dfDIJoystick' が未解決

DirectX 7 SDK にある dinput.lib で上書きすれば変数が使えるようになる。

SDK のディレクトリ\lib\borland\dinput.lib
↓ 上書き
BCC のディレクトリ\lib\PSDK

ただ、この状態ではリンク時にエラーが発生する。

Error: Error processing module

参考サイトにあった情報によるとライブラリのモジュール順番が原因とのことなので、その記事に従って dinput.lib を再構築する。

まず、適当なディレクトリを作成して、DirectX 7 SDK 側の dinput.lib をそこにコピー。次に以下の内容でバッチファイルを作成する。

tlib dinput.lib -*dilib1 -*dilib2 -*dilib3 -*dilib4 -*dilib5
tlib dinput.lib -*DirectInputCreateA -*DirectInputCreateEx -*DirectInputCreateW
tlib dinput.lib -*DllCanUnloadNow -*DllGetClassObject
tlib dinput.lib -*DllRegisterServer -*DllUnregisterServer

tlib dinput.lib +dilib1 +dilib2 +dilib3 +dilib4 +dilib5
tlib dinput.lib +DirectInputCreateA +DirectInputCreateEx +DirectInputCreateW
tlib dinput.lib +DllCanUnloadNow +DllGetClassObject
tlib dinput.lib +DllRegisterServer +DllUnregisterServer

バッチを実行すると再構築された dinput.lib が出来上がるので、それを元の位置にコピーすれば完了。

DirectDrawCreateEx が使用できない

BCC 付属の ddraw.h は DirectDrawCreateEx の宣言があっても、ddraw.lib 側に実態が存在しないので呼び出すとエラーになってしまう。

Error: 外部シンボル 'DirectDrawCreateEx' が未解決

DirectX 7 SDK 付属の ddraw.lib で上書きすれば使えるようになる。

SDK のディレクトリ\lib\borland\ddraw.lib
↓ 上書き
BCC のディレクトリ\lib\PSDK

DirectX 7 SDK を優先的に使う

結局やっていることは BCC 付属のライブラリを DirectX 7 SDK に入れ替えているだけなので、ちまちまコピーせずに全て入れ替えてやった方が早い。ファイルレベルでの入れ替えは面倒なので、各 cfg ファイルで DirectX 7 SDK を優先的に読むよう指定する。

// bcc32.cfg
-I"SDK のディレクトリ\include;c:\Borland\Bcc55\include"
-L"SDK のディレクトリ\lib\borland;c:\Borland\Bcc55\lib;C:\borland\bcc55\Lib\PSDK"

// ilink32.cfg
-L"SDK のディレクトリ\lib\borland;c:\Borland\Bcc55\lib;C:\borland\bcc55\Lib\PSDK"

dinput.lib の再構成だけは必要なので忘れないよう注意。