読者です 読者をやめる 読者になる 読者になる

GCCでDXライブラリを使用してみる

GCCでDXライブラリを使用できるか試してみたのでメモしてみます。
(記述に誤りを見つけたらお教えください)

DXライブラリはVC++/BCC用の静的リンクなライブラリが配布されていてますが、この他にC#用のライブラリも公開されていて、これに同梱されているDxLib.dllを利用すれば他の開発環境からもからもいじくれるっぽいです。

以下、初期化関数のDxLib_Initを利用する手順。

  • DxLib.dllをdumpbin /exportsかDependency Walker*1に喰わせて装飾名を確認すると、初期化関数のDxLib_Initは_dx_DxLib_Init@0という名前で公開されていることがわかる。
  • CからはLoadLibraryとGetProcAddressを使って、

HMODULE h = LoadLibrary("DxLib.dll");
int (__stdcall *DxLib_Init)(void); // 関数ポインタ
DxLib_Init = GetProcAddress(s_hm, "_dx_DxLib_Init@0");

みたいな雰囲気で書けば、DxLib_Init();を実行できるようになります。
Cygwin+GCCでもMinGWでも適当にコンパイルすれば動きます。

http://members.jcom.home.ne.jp/wtetsu/diary/d20070112.zip

      • -

めも。

DxLib.dllはもともとVC++(またはC#等、他のMicrosoft環境?)で利用するためのものっぽい雰囲気で、具体的には関数が@混じりの変な名前で公開されている。たとえばChangeWindowModeは、DLLでは_dx_ChangeWindowMode@4という名前で公開されている。

これはC++のオーバロード機能のためにコンパイラが勝手に付けている名前だが、この規則はコンパイラ依存になるため厄介(ちなみに@の後ろの数字は引数のバイト数)

前述の手順では、DxLib.dllの公開名を自力で探して、GetProcAddressするという手順をとっているが、他にも

  1. DXライブラリのソースから、装飾名が付かないようにDLLをビルドする
  2. DxLib.dllの関数を右から左に受け流すラッパDLLをVCで作る(当然、装飾名が付かないように)

という手もありえると思います。

*1:どちらもVC++に付属