今回、自作したDLLとそのヘッダファイルを提供しようと考えてます。
ヘッダファイルにはクラスとそのメンバ変数・関数を明記しています。
ここで悩ましい点として提供するヘッダファイル内に
クラスのメンバ変数を記載しており
出来るだけprotectのメンバ変数は開示したくありません。
しかし、現状ではクラス内にメンバ変数を記載した状態でないと
使う側のコンパイルが通らずに悩んでいます。
何か良い方法や通常DLLを提供する側が行う方法などあれば教えて頂けませんか?
まず、基本的なことを確認しますと、C言語で書かれたDLLは
1.enum struct union等の、ユーザーが必要となるデータ構造は公開されている。
2.それらを扱う関数も公開されている。
3.ただし、関数内のコードは公開しなくて良い。
ということは、ご存知ですね。
翻って、C++言語の「クラス」はデータ構造とそれを扱うメソッドを
統合したものと捉えることができます。
従って、そのクラスをエクスポートしたら、
内部の1.と2.も公開されなければ、使えないことになります。
ゆえに、クラスメンバー変数も公開しなければならないわけで、
これが基本で、MFCもそうなっています。
4.つまり、それは当たり前のことなのです。
次に、データ構造を隠蔽する方法ですが、考えられる方法は
5.そのデータ構造、ないしクラスをユーザーに公開しないような仕組みにする。
だけです。例えば、WindowsのHDCは実は構造体で大昔のものは
ソースが公開されていますが、基本的には非公開です。
これはDECLARE_HANDLE()マクロで隠蔽しています。
簡単に言うと型のポインタのみを別名にして公開しているわけですね。
これ以外の方法としては、
5.DLLの関数の全てをC言語インターフェースにしてエクスポートし、
クラス定義を公開しない。
という方法もあります。内部的にはC++で書かれてはいるが、
外部から利用できるのは、エクスポートされたC言語関数のみ。
ということですね。
非常に分かりやすいご回答有難うございます。
感謝致します。
5.の単純にエクスポートする方法が簡単だと思いました。
また、1~3で記載頂いた内容が奥深いです。
今まで単にMFCクラスなどの実装をしていたため
「公開/非公開すべき情報」に関して区別していませんでしたため、
私にとっては新しい考え方を教わりました。
ようやくDLLの実装方法が分かりましたので
上記の点を考慮した上で実装してみようと思います。
ありがとうございました。