DLLで変数の値を保持するには

解決


初心者  2005-03-24 07:43:10  No: 56755

以前にも同じような内容の質問をさせていただいたのですが、少し主旨が変わったのでまた質問させていただいております。

C言語とBCCでDLLを作成しています。
DLL内でグローバル変数を宣言し、値を代入しているのですが、ひとつの呼び出し元から同時に複数のコールを受けた場合、2回目に呼ばれた際に内容が初期化され、1回目のコールでするべき処理が中断してしまいます。

同時にいくつでもコールを受けられるようにするには、変数をどのように管理する必要があるのでしょうか?どなたかご教授ください。


papa  2005-03-24 09:06:14  No: 56756

そのグローバル変数がどんな役割をするのかわかりませんが
ローカル変数で処理できないのですか?


Disca  URL  2005-03-24 11:03:37  No: 56757

通常(C++実装)ですと classを用いたりnew 等で動的に変数を増やします。

Cの場合では、C++と同様にDLLの参照カウンタから、何らかの動的処理を構築する必要があります。

--
一度、Googleで「DLLMain 参照カウンタ」を検索してみてください。

http://66.102.7.104/search?q=cache:vobkQxOuhxYJ:wisdom.sakura.ne.jp/system/winapi/win32/win149.html+DLLMain+%E5%8F%82%E7%85%A7%E3%82%AB%E3%82%A6%E3%83%B3%E3%82%BF&hl=ja


初心者  2005-03-24 19:37:37  No: 56758

変数の値は、DLLがロードされてからアンロードされるまで同じ値をとり続けたいのですが、ローカル変数で管理した場合、たとえば2回目のコールを受けて以降、どうやって1回目のコール時の変数にアクセスすればいいのでしょうか?


シャノン  2005-03-24 22:17:03  No: 56759

やはり、呼び出し側(exe 側)で保持するのが、一番簡単ではないでしょうか。


初心者  2005-03-24 23:03:28  No: 56760

うーん・・。
WindowsAPIのEDITのようなものを作りたいので、できれば利用者側には内部データを隠蔽したいのですが・・・。


Ban  2005-03-24 23:47:02  No: 56761

API の EDIT って EditControl のことですか?
それなら利用者がハンドル(HWND)を持ってるはずですけど。
内部データを見せるのと識別用のキーを保持させるのは別物だと思いますが。


Ban  2005-03-24 23:47:14  No: 56762

API の EDIT って EditControl のことですか?
それなら利用者がハンドル(HWND)を持ってるはずですけど。
内部データを見せるのと識別用のキーを保持させるのは別物だと思いますが。


Ban  2005-03-24 23:48:51  No: 56763

# 誤ってエンター叩いてしまいました。
# 二重投稿すいません....orz


シャノン  2005-03-25 06:49:59  No: 56764

Windows には実に多くの「ハンドル」がありますが、ハンドルの実体は様々で、例えば何らかの情報を格納した構造体のアドレスだったりすることもあります。
DLL の方に、何らかの関数をつくり、EXE からそれを呼ばせて、関数内では動的にメモリを確保し、そこに保持したい情報を入れて、ポインタを EXE に返すとか。
ポインタを HANDLE にでもキャストして返してやれば、EXE 側からは返された値は「ハンドル」として扱う他はありませんので、内部データは隠蔽できます。
EXE 終了前に、DLL が提供するメモリ解放関数を呼ばせる必要がありますけど。


初心者  2005-03-25 20:10:56  No: 56765

あ、構造体のアドレスを持ってればいいんですね。
ご教授ありがとうございました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加