トップページ > 過去ログ > 記事閲覧
オリジナルdll内でDXLib関数がうまく実行されない
名前:ルーキー 日時: 2011/11/13 17:04

いつもDXLibには大変お世話になってます m(_ _)m 自身で解決できない問題があるので質問をさせて下さい。 今、DXLib関数を利用したオリジナルソースを、 dll化して使っていきたいと思っております。 試しに以下のようなテストソースを組んだのすが、 オリジナルdll内で実行するDXLibの関数がうまく反映されません。 具体的には、下記の例ではオリジナルdllにてprintfDx, PlaySoundFile を使ってますが、  printDx : 0を返すのに、文字列が画面に表示されない。  PlaySoundFile : -1返し、wavが鳴らない。wavファイルは配置。 逆にmain.cpp内で各DXLibの関数を使用すれば、正しく文字表示やwav再生が実現します。 お手上げ状態です。。 ------------------↓ main.cpp ↓---------------------- #include "DxLib.h" #include "dll_sample.h" #pragma comment(lib, ".\\Release\\dll_sample.lib") //検索Libファイルの設定 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { ChangeWindowMode(TRUE); if(DxLib_Init() == -1) return -1; ProcessMessage(); //printfDx( "TEST1" ); //PlaySoundFile( "test.wav" , DX_PLAYTYPE_NORMAL ) ; method1(); //オリジナルdllの関数呼び出し ScreenFlip() ; while( CheckHitKeyAll() == 0 ) if( ProcessMessage() == -1 ){break;} DxLib_End() ; return 0; } ------------------↓ dll_sample.cpp ↓---------------------- #include "dll_sample.h" #include "DxLib.h" int debug = 1; __declspec(dllexport) void method1(){ debug = printfDx( "TEST2" ); debug = ScreenFlip() ; debug = PlaySoundFile( "test.wav" , DX_PLAYTYPE_NORMAL ) ; } ------------------↓ dll_sample.h ↓---------------------- __declspec(dllexport) void method1(); お手数ですが、ご教授お願いいたします。 //ルーキー

Page: 1 |

Re: オリジナルdll内でDXLib関数がうまく実行されない ( No.1 )
名前:Will 日時:2011/11/13 20:24

DXライブラリラッパーのDLL化はしたことないですが(lib化はしたことありますけど)、 そのような場合、DXライブラリの関数は全て単一のDLL内で実行しないと正常動作できないと思います。 なぜかというと、DLLにリンクされるDXライブラリと、exeにリンクされるDXライブラリは その実体が別のものになるからです。 そのため、exeでDxLib_Initをしてもそれはexe側のDXライブラリの話であり、DLL側のDXライブラリには 関係ないため、DLL側ではDxLib_Init未実行状態でDXライブラリの関数を呼び出しているので正しく動作 しないのです。
Re: オリジナルdll内でDXLib関数がうまく実行されない ( No.2 )
名前:ルーキー 日時:2011/11/14 19:12

Willさん  本件、ご回答ありがとうございます。 >DLLにリンクされるDXライブラリと、exeにリンクされるDXライブラリは >その実体が別のものになるからです。 両者共にDXLib_init()をかけてみましたが、おっしゃる通り呼び出し後に別のオブジェクトが存在しておりますね。 exeとdllとで同一のDXLibオブジェクトを共有できない以上、dll化は困難ですね。残念です。。 ちなみに本件dll化を考えた理由は定石通り保守/管理が目的です。 exe単体ですとexeファイルそのものが7[MB]となり、もしバグ等発生した場合にexeそのものをアップデートすると結構な負担となります。 設定iniやスクリプト、各種参照ファイルは当然分けておりますが、ソースが万単位の行となるとまぁ容量も肥大化しますよね。 リビルドも時間かかりますし。 (7[MB]程度ならまだかわいいものと思われるかもしれませんが。。) とそんな経緯でした。何かかけるアドバイス等あればお願いいたします。 //ルーキー
Re: オリジナルdll内でDXLib関数がうまく実行されない ( No.3 )
名前:いっち 日時:2011/11/16 20:33

> exe単体ですとexeファイルそのものが7[MB]となり、もしバグ等発生した場合にexeそのものをアップデートすると結構な負担となります。 差分更新ツールの使用は検討されましたか?
Re: オリジナルdll内でDXLib関数がうまく実行されない ( No.4 )
名前:ルーキー 日時:2011/11/17 21:33

いっちさん ご意見ありがとうございます。ご返信遅くなりました。 >差分更新ツール バージョン管理ツールの事でしょうか?? 本件、利用シーンとしてはお客様にソフトを展開した後にバグが発生したとして、修正版を再展開… というような事を考えてます。 ですので、修正版のexeを丸ごとパッチ化するのではなく、バグのあるdll,スクリプトのみパッチ化するというような事を考えてました。 (ご質問内容に対して正しく回答できていなければ申し訳ありません)
Re: オリジナルdll内でDXLib関数がうまく実行されない ( No.5 )
名前:いっち 日時:2011/11/17 23:52

私の知っている範囲ですと WDiff ですが古いツールなので今はもっと良いものがあるかもしれません。 どのようなものかはつかってみれば分かると思います。
Re: オリジナルdll内でDXLib関数がうまく実行されない ( No.6 )
名前:Will 日時:2011/11/18 12:01

実際に出来るかどうかはわかりませんけど、私であれば以下のように設計してみます。 ・DXライブラリは頻繁に変更されるものではexeにリンクする ・DXライブラリのラッパクラスを作る ・ラッパクラスの実態はexe側に置く ・DLLにはこのクラスを参照で渡して間接的にDXライブラリを使用できるようにする #ソースで示してくれとかは勘弁して下さい
Re: オリジナルdll内でDXLib関数がうまく実行されない ( No.7 )
名前:ルーキー 日時:2011/11/18 20:22

Willさん >・DXライブラリは頻繁に変更されるものではexeにリンクする >・DXライブラリのラッパクラスを作る >・ラッパクラスの実態はexe側に置く >・DLLにはこのクラスを参照で渡して間接的にDXライブラリを使用できるようにする あれから考えて、私自身も概ね上記構成で組んでました。 ただ、考え方として、exeがdll側をよび、そのdllがexeを呼ぶ とあまり見ない構成ですし、 dllの本来の独立性としての意味合いが薄れますよね。(exe内のラッパ関数が固定という前提ですし…) 結果的に当初目的としていた要件を満たすので、 この方向で参ろうと思いますが、他プロダクトを開発するとき、 ラッパのインターフェースが固定である保証がないのが、もやもやしてます。 無論それは自分の設計次第なのですが^^; お世話になりました。

Page: 1 |