トップページ > 過去ログ > 記事閲覧
Ver 3.02 の DxLib.dll について
名前:羽流布 日時: 2010/03/31 00:17

初めての書き込みです。羽流布《うるふ》と申します。 当方、D言語からDXライブラリを利用させて頂いております。 この度 3.00d → 3.02 のバージョンアップ作業中に問題が発生したため、質問をしようと思った次第です。 その問題とは DxLib.dll の形式に関することです。 インポートライブラリ DxLib.lib を作成するため、ボーランド社の impdef.exe を用いて DxLib.dll から DxLib.def を作成するのですが、 その際、出力される DxLib.def の形式が過去バージョンと異なるようなのです。 僕はDLLに詳しくありませんので具体例を示します。 【Ver 3.00d の DxLib.def】 LIBRARY DXLIB.DLL EXPORTS VAdd = _VAdd@24 VCross = _VCross@24 VDot = _VDot@24 (以下略) 【Ver 3.02 の DxLib.def】 LIBRARY DXLIB.DLL EXPORTS _dx_AddKeyAccel = dx_AddKeyAccel ; dx_AddKeyAccel _dx_AddKeyAccel_ID = dx_AddKeyAccel_ID ; dx_AddKeyAccel_ID _dx_AddKeyAccel_Name = dx_AddKeyAccel_Name ; dx_AddKeyAccel_Name (以下略) このようになるのですが、これは意図的なものなのでしょうか? 手動で下記のように書き直しても上手くいきませんでしたので(汗) LIBRARY "DATA\DXLIB.DLL" EXPORTS _dx_AddKeyAccel @24 _dx_AddKeyAccel_ID @20 _dx_AddKeyAccel_Name @20 (以下略) どなたか御教授お願いしますm(_ _)m

Page: 1 |

Re: Ver 3.02 の DxLib.dll について ( No.1 )
名前:ysnr 日時:2010/03/31 13:32

関数名の修飾の違いは、呼び出し規約の変更によるものと思われます。 詳しくは __stdcall, __cdecl, export 等のキーワードで検索してください。 C# 版 dxlib.dll を D で使用するためのインポートライブラリ作成方法は次のようになります。  % implib /system dxlib.lib dxlib.dll DLL のパスを変更したい場合の手順は以下のとおりです。 (1) def ファイル作成  % impdef -a dxlib.def dxlib.dll (2) dxlib.def を編集  LIBRARY DXLIB.DLL   ↓  LIBRARY "DATA\DXLIB.DLL" (3) lib ファイル作成  % implib /system dxlib.lib dxlib.def 上記手順で作成した lib を用いて次のサンプルが動作することを確認しました。 pragma(lib, "dxlib.lib"); extern (C) int dx_DxLib_Init(); extern (C) int dx_GetColor(int, int, int); extern (C) int dx_DrawString(int, int, char*, int, int); extern (C) int dx_WaitKey(); extern (C) int dx_DxLib_End(); void main() { dx_DxLib_Init(); dx_DrawString(100, 100, "hoge", dx_GetColor(255,255,255), 0); dx_WaitKey(); dx_DxLib_End(); }
Re: Ver 3.02 の DxLib.dll について ( No.2 )
名前:羽流布 日時:2010/03/31 18:05

親切な回答ありがとうございます^^ どうやら EXPORTS については変更不要だったようですね。。。 というか implib で DxLib.dll から直にインポートライブラリを作成できるのですね! 今までネットから得た断片的な知識でやってきた節がありますので、 これを機にきちっと勉強してみようと思います。 では失礼します。
Re: Ver 3.02 の DxLib.dll について ( No.3 )
名前:ysnr 日時:2010/04/06 22:34

ごめんなさい、間違いを書いてしまいました。 呼び出し規約はこれまで通り__stdcallでした。 DLL内部の装飾名を変更しているだけのようです。 よって先のコードではstackの解放が二重に行われておかしなことになります。 以下はおそらく間違っていないであろう対応方法です。 -------------------------------------------------- 次のような書式でdefファイルを作成すればimplibでimport libraryを作成できるようです。 @markの後ろの値は引数のサイズ(byte数)です。 LIBRARY "DXLIB.DLL" EXPORTS _dx_DxLib_Init@0 = dx_DxLib_Init _dx_DxLib_End@0 = dx_DxLib_End _dx_ProcessMessage@0 = dx_ProcessMessage _dx_GetColor@12 = dx_GetColor _dx_DrawGraph@16 = dx_DrawGraph _dx_LoadGraph@8 = dx_LoadGraph _dx_ScreenFlip@0 = dx_ScreenFlip _dx_SetDrawScreen@4 = dx_SetDrawScreen _dx_SetGraphMode@16 = dx_SetGraphMode _dx_DrawString@20 = dx_DrawString ・ ・ ・ D側での宣言は 'extern (Windows)' を使います。 extern (Windows) int dx_DxLib_Init(); -------------------------------------------------- defファイルの作成が大変ですね。もっと簡単な方法があればよいのですが・・・
Re: Ver 3.02 の DxLib.dll について ( No.4 )
名前:羽流布 日時:2010/04/10 09:18

うう・・・仕事で時間がないorz 実は質問する前に「@引数のバイト数」を手動で書いていたのですが消してしまったようですw 早まりましたぁ(;^^ しかしながら、ありがとうございます。 なんとか頑張ってみようと思います。

Page: 1 |