久しぶりに投稿いたします。ぱんぷきんと申します。
現在、MFCを用いたアプリケーションを作成しており、一通りの機能が完成しておりま
す。
現在、お客さんにお渡しする際に、ソースコードの一部だけ非公開とし、残りの部分を
公開するように、とのお話があったので、ソースの一部のクラスだけDLL化しようとして
います。
そこで、公開したくない部分のソースのみをMFC AppWizard(dll)形式で作成したプロジ
ェクトにコピーし、そこでビルド、できたDLLを元のプロジェクトに組み込んで使用する
といったことを考えておりました(もちろん元のプロジェクトでは、非公開部分のソー
スは外します)。
なお、非公開部分のソースは、公開部分のクラスや関数を使用しているため、ヘッダフ
ァイルをインクルードしたり、クラス内部で公開部のクラスのインスタンスを生成した
りしています。
DLL化のため、まず非公開部分のヘッダ、ソースのみをDLL化しようとビルドしてみる
と、元のプロジェクトのヘッダファイルがないと、識別子がわからないと言われ、
では、ヘッダファイルをDLLのプロジェクトに組み込んでビルドしてみると、今度は、関
数本体が定義されていないとエラーがでました(ある意味あたりまえといえば当たり前
なのですが。。)。
さすがに、外部の関数本体までコピーすると、結局DLL内に全部のプログラムが収まるよ
うな感じになってしまい、このままでは、公開部の意味がなくなると考えております
(お客さんのほうで、外部のソースをいじって、保守するため)。
そこで、どなたか、DLL外部の定義を関数本体を組み込むことなく、参照できるような方
法についてご存知ないでしょうか?
長文になってしまい、申し訳ありませんが、よろしくお願い申し上げます。
class AFX_EXT_CLASS Hoge
{
...
};
と、AFX_EXT_CLASSをつけると、
(DLLプロジェクト以外でincludeしたとき)
このクラスの実装はDLL内部にあるという意味になります。
「EXE 本体から呼ばれたなら一連の処理を行い、処理完了で呼び出し元に戻る」
というのがライブラリの基本動作なわけで、そう作るのが普通。
途中で本体を呼び出す必要が無いように作るのが良い考えです。
どうしても本体を呼びしたいのなら MFC と同じ構造にするといい。
DLL 提供者は class CWnd のヘッダを提供し
EXE 実装者に class CHogeWnd:public CWnd を実装してもらう。
DLL 側は必要な時 CWnd::On() を呼ぶ。
EXE 側は CHogeWnd::On でそれを受け取ることができる。
そこまで必要なければ callback を登録するだけでも良いのではないかと。
ご教授いただきましてありがとうございます。
教えていただいたプログラムの方法とはあまり関連はないのですが、
とりあえず、プロジェクトでうまく分離できそうなところを切りわけ、
呼ばれる側のDLLの方を公開部に、アプリケーションのベースなどを非公開とするこ
とで、一応の解決ができました。
ありがとうございました。