トップページ > 過去ログ > 記事閲覧
DLL の中から直接描画したい
名前:「たく」 日時: 2007/03/23 05:27

DxLib、重宝させていただいております。 現在、DLL に個別機能を分割させたプログラムを制作しています。 メイン側からはLoadLibrary();で DLL を動的に読み出し、 GetProcAddress(); でDLL内の関数を呼び出して処理を行い、 不要となったらFreeLibrary();で解放するという方法のものです。 ここからが質問なのですが、現在メイン側で DxLib を設定して各種 描画を行っているのですが、DLL の中で DxLib を使った描画を行う 手法が判らず現在困っています。何かよい方法はありますでしょうか。 ちなみに DLL への情報引き継ぎは、メイン側で定義したグローバルな 構造体のポインタのみを引き継ぐ形にしてありますが、これに DxLib 用の情報を追加するような仕組みでも構いません。 少々変わった手法となっているのは承知ですが、よろしくお願いします。

Page: 1 |

Re: DLL の中から直接描画したい ( No.1 )
名前:管理人 日時:2007/03/23 16:37

 たくさん始めまして、DXライブラリの管理人です。  DLL側からメイン側のDXライブラリの関数を使用する場合は、  アドレスが分からないDLL側の関数を使いたい場合にメイン側が GetProcAddress を 使用してDLL側の関数のアドレスを取得しているのと同じように、メイン側の DXライブラリの関数アドレスが分からないDLL側に、メイン側からDXライブラリの 関数のアドレスを教えてあげる必要があります。 (そしてDLL側はメイン側から渡されたDXライブラリの関数のアドレスを使用して DXライブラリの関数を呼びます)  というわけで、たくさんが既にお察しの通りメイン側で定義したグローバルな 構造体の中にDXライブラリの関数のアドレスを格納するポインタを幾つも追加する ことになると思います。  こちらにDLLからメイン側のDXライブラリの関数を呼び出している簡単なサンプルを アップしましたので、宜しければご覧になってみて下さい。m(_ _)m http://homepage2.nifty.com/natupaji/temp/DLL_DXFunc.ZIP  中に入っている readme.txt と、プログラム内の注釈だけでは分からない点が ありましたらご質問下さい。
Re: DLL の中から直接描画したい ( No.2 )
名前:「たく」 日時:2007/03/24 12:31

わかりやすいサンプルありがとうございます。 DxLib の関数に限らず、自作関数もこの方法で DLL 内部から呼び出せそうですね。 アドレスを教えるための設定によって生ずる オーバーヘッドがどの程度かは判りませんが、 経験則からするとロード時にオーバーヘッド が少し生じても一度ロードしてしまえば ロード中はさほどかからないっ、て感じで しょうか。1ステージの開始時に DLL を 読み込んで、終了時にメモリを解放すると いう方法で対処できそうですね。 ありがとうございました。
Re: DLL の中から直接描画したい ( No.3 )
名前:管理人 日時:2007/03/24 15:41

 たくさんどうも、DXライブラリの管理人です。 > ロード時にオーバーヘッド > が少し生じても一度ロードしてしまえば > ロード中はさほどかからないっ、て感じで > しょうか。  はい、アドレスは一度教えてしまえば DLL を再読み込みするまでは 何もしなくて良いですので、後はDLLからメイン側のDXライブラリの 関数を呼び出した時の負荷と、メイン側からDXライブラリの関数を 呼び出した時の負荷の差程度のオーバーヘッドということになります。 で、関数ポインタを使用して関数を呼び出した場合(DLL側)と、 直接関数を呼び出した場合(メイン側)の負荷の差は int a. *p; a = 0; // @ p = &a; *p = 10; // A  上記の@の直接変数aに値を代入した場合の負荷と、Aのポインタを 介して変数aに値を代入した場合の負荷の差程度しかありませんので、 関数内で行われる処理の負荷と比べると殆ど0に近いです。  なので、DLL側からDXライブラリの描画関数を呼び出すことによる ペナルティは無いと考えてしまっても大丈夫です。
Re: DLL の中から直接描画したい ( No.4 )
名前:「たく」 日時:2007/03/26 12:02

丁寧な解説、ありがとうございます。 今実際にいただいたサンプルプログラムを参考にして 組み込んで使っています。ほとんど速度の低下もなく テンプレート化もしやすいので重宝しています。 ところで、いただいたファイルの方法では、最初に DLL の初期化関数を呼んだところで、グローバル変数として 関数名リスト構造体を作ってそこに関数アドレス一覧を 入れていますよね。この方法だと、 freelibraly() など でメモリを解放した時に、メモリリークが発生したり しないでしょうか。また、このグローバル変数を DLL の 中で明示的にクリアする方法は何かありましたでしょうか。 DxLib の話ではなくて、どちらかというと Windows プロ グラムの範疇になるかと思いますが、よろしければご教授 願えると幸いです。宜しくお願いします。
Re: DLL の中から直接描画したい ( No.5 )
名前:「たく」 日時:2007/03/26 12:05

上記に加えて、たとえば DLL の中で malloc などで メモリを確保した場合に、そのメモリを free で 解放する前に freelibrary() などで DLL を解放 してしまった場合はどうでしょうか。イメージ的 には、こっちはメモリリーク発生しそうな感じで ですが・・・
Re: DLL の中から直接描画したい ( No.6 )
名前:管理人 日時:2007/03/26 14:03

 たくさんどうも、DXライブラリの管理人です。 > ところで、いただいたファイルの方法では、最初に DLL > の初期化関数を呼んだところで、グローバル変数として > 関数名リスト構造体を作ってそこに関数アドレス一覧を > 入れていますよね。この方法だと、 freelibraly() など > でメモリを解放した時に、メモリリークが発生したり > しないでしょうか。  発生しないと思いますが、何故メモリリークの可能性をお考えに なられたのか気になります。 > また、このグローバル変数を DLL の > 中で明示的にクリアする方法は何かありましたでしょうか。  今回のDLLでは DllMain 関数がありませんが、DllMain 関数内で クリアすることが出来ると思います。   > 上記に加えて、たとえば DLL の中で malloc などで > メモリを確保した場合に、そのメモリを free で > 解放する前に freelibrary() などで DLL を解放 > してしまった場合はどうでしょうか。イメージ的 > には、こっちはメモリリーク発生しそうな感じで > ですが・・・  Win32API のメモリ確保APIである HeapAlloc 等を使用して メモリを確保した場合はメモリリークとなりますが、簡単に試した 限りでは malloc で確保したメモリは freelibrary の際に自動的に 解放されるようですのでメモリリークにはなりません。 (この辺りは標準ライブラリ次第なので必ず自動的に解放されるとは 言えませんが・・・)

Page: 1 |