Posts
Borland C++ Compiler で DirectX 7
BCC には最初から DirectX 関連ファイルが付属しているものの、実際にプログラムをコンパイルをしてみるとまともに動かない。
この BCC に関するトラブルを扱ったページはいくつかあるが、情報が断片的なのでコンパイルが出来るようになるまでかなりの時間を浪費する。環境を再構築する際にまた同じことをするのは嫌だったので、一連の問題と解決策をまとめておくことにした。
問題解決には DirectX 7 の SDK が必要なので、持っていない場合は予めダウンロードしておく必要がある。
この記事を書くにあたり下記ページを参考にした。
Borland C++ Compiler で DirectX プログラミング- yaneuraoGameSDK3rd
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 の再構成だけは必要なので忘れないよう注意。