Seaside Laboratory

Post

Borland C++ Compiler で DirectX7

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

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

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

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

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

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

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

DirectX7 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 が開けません

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

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

DirectInput 関連の問題

BCC 付属の dinput.lib は、IDirectInputDevice7::SetDataFormat で使用する定義済みのグローバル変数が定義されていないので、読み出すことが出来ずエラーになります。

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

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

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

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

Error: Error processing module

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

まず、適当なディレクトリを作成して、DirectX7 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' が未解決

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

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

DirectX7 SDK を優先的に使う

結局やっていることは BCC 付属のライブラリを DirectX7 SDK に入れ替えているだけなので、ちまちまコピーせずに全て入れ替えてやった方が早いです。ファイルレベルでの入れ替えは面倒なので、各 cfg ファイルで DirectX7 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 の再構成だけは必要なので注意してください。