以前にも同じような内容の質問をさせていただいたのですが、少し主旨が変わったのでまた質問させていただいております。
C言語とBCCでDLLを作成しています。
DLL内でグローバル変数を宣言し、値を代入しているのですが、ひとつの呼び出し元から同時に複数のコールを受けた場合、2回目に呼ばれた際に内容が初期化され、1回目のコールでするべき処理が中断してしまいます。
同時にいくつでもコールを受けられるようにするには、変数をどのように管理する必要があるのでしょうか?どなたかご教授ください。
そのグローバル変数がどんな役割をするのかわかりませんが
ローカル変数で処理できないのですか?
通常(C++実装)ですと classを用いたりnew 等で動的に変数を増やします。
Cの場合では、C++と同様にDLLの参照カウンタから、何らかの動的処理を構築する必要があります。
--
一度、Googleで「DLLMain 参照カウンタ」を検索してみてください。
変数の値は、DLLがロードされてからアンロードされるまで同じ値をとり続けたいのですが、ローカル変数で管理した場合、たとえば2回目のコールを受けて以降、どうやって1回目のコール時の変数にアクセスすればいいのでしょうか?
やはり、呼び出し側(exe 側)で保持するのが、一番簡単ではないでしょうか。
うーん・・。
WindowsAPIのEDITのようなものを作りたいので、できれば利用者側には内部データを隠蔽したいのですが・・・。
API の EDIT って EditControl のことですか?
それなら利用者がハンドル(HWND)を持ってるはずですけど。
内部データを見せるのと識別用のキーを保持させるのは別物だと思いますが。
API の EDIT って EditControl のことですか?
それなら利用者がハンドル(HWND)を持ってるはずですけど。
内部データを見せるのと識別用のキーを保持させるのは別物だと思いますが。
# 誤ってエンター叩いてしまいました。
# 二重投稿すいません....orz
Windows には実に多くの「ハンドル」がありますが、ハンドルの実体は様々で、例えば何らかの情報を格納した構造体のアドレスだったりすることもあります。
DLL の方に、何らかの関数をつくり、EXE からそれを呼ばせて、関数内では動的にメモリを確保し、そこに保持したい情報を入れて、ポインタを EXE に返すとか。
ポインタを HANDLE にでもキャストして返してやれば、EXE 側からは返された値は「ハンドル」として扱う他はありませんので、内部データは隠蔽できます。
EXE 終了前に、DLL が提供するメモリ解放関数を呼ばせる必要がありますけど。
あ、構造体のアドレスを持ってればいいんですね。
ご教授ありがとうございました。
ありがとうございました。
ツイート | ![]() |