- ベストアンサー
グローバル変数はDLLの中で使えますか?
DLL化する関数の中でグローバル変数を使っているのですが、 DLLの関数の中でもグローバル変数を使えますか? やっぱり、引数として渡すしかないでしょうか? Delphi XE5 starter を使っています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>DLL化する関数の中でグローバル変数を使っているのですが、 >DLLの関数の中でもグローバル変数を使えますか? DLL内ではグローバル変数は使えません。 DLLは、リエントラント(スレッドセーフ)にすべきです。 >やっぱり、引数として渡すしかないでしょうか? そうなるでしょうけど、不正な引数を渡された時にエラーで弾く仕組みが必要だと思います。 例えば、構造体のポインタを渡す方式にして、構造体の先頭のメンバーに「構造体のサイズ」を予めセットしておかないと呼び出し時にエラーにする、など。 こうすると、バージョンアップで「構造体メンバーが増えた時」に、先頭のメンバーに入っている「構造体のサイズ」をDLL側で検査する事で「旧方式で呼び出した」か「新方式で呼び出した」かを判定して処理を振り分けできます。
補足
回答ありがとうございます。 DLLについて調べていて、わかったんですが、PChar型またはShortString型以外のデータをやり取りできるのはDLLとDLLを使うプログラムの両方をDelphiで作った場合だけなんですか? これ以外のデータをやり取りする場合(文字配列、TStringListのデータ等)は、構造体のポインタを渡し、構造体のポインタを受け取るようにするしかないのですか?