トップ回答者
MFC 自作コントロールのRelease版DLLをDebug環境で使うとアサートする

質問
-
いつもお世話になっております。MFCのCScrollView派生のコントロールを作りMFC拡張DLLにしました。クラス名はCHogeViewとします。MFC AppWizard(exe)でSDIのサンプルアプリ(CHogeSample)を作りこのDLLをリンクしてビュークラスをCHogeView派生としました。このときRelease環境ではReleaseビルドのDLL,Debug環境ではDebugビルドのDLLにすれば正常に動作するのですが、Debug環境でReleaseビルドのDLLを使おうとすると実行時にInitInstanceのドキュメントテンプレート登録でassertします。pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CHogeSampleDoc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CHogeSampleView));CDocTemplateコンストラクタの以下のアサートで引っかかっているようです。ASSERT(pViewClass == NULL ||pViewClass->IsDerivedFrom(RUNTIME_CLASS(CView)));ReleaseビルドのDLLはDebug環境ではドキュメントテンプレート登録して使えないものなのでしょうか?なぜDebugビルドのDLLにしないかというと、このDLLは公開したいのですがソースは公開したくないのでDebugのDLLは外にだしたくないからです。どなたかなんでも結構ですので情報をお持ちの方いらっしゃれば教えていただけないでしょうか?よろしくお願いします。
回答
-
jzkeyさんが書かれた流れで合っています。Debug版DLLのデバッグ情報にはソースが含まれるものと思っていましたがそうではないのでしょうか?>C++のクラスの入ったdllをバイナリのみで配布・メンテすること自体それなりに骨ですが(C++にはバイナリ互換が>ほとんどないからこそのCOM/ActiveXですし)、それを考慮済みというなら>C++のクラスをDLLバイナリで配布というのは今まで何度もやっていることなので問題ないと思いますが、MFCクラスをDLLで公開するのは今回がはじめてなのでとまどっています。一般的にMFCクラスをDLLバイナリで配布している個人、企業はほとんどない?ようですね。
ですから、Debug版のDLLだけを公開してソースを配らないとDLLの中までデバッガで入る事は出来ません。
これに関しては実際に自分の環境で試してみれば、すぐにわかりますよ。
DLLの中にファイルの位置も持っているのでソースが入っているディレクトリを動かしてしまうと
自分の開発環境でもうまくデバッガで追えなくなるはずです。
jzkeyさんが書かれているようにDLLバイナリでの配布の場合、コンパイラのバージョンが合わないと問題になるので
各コンパイラのバージョン毎にDLLを用意するハメになりますよね。その部分の事を大変だと言われているのだと思います。
jzkeyさんが書かれているようにコンパイラのバージョン等を気にしなくても良いように一般的なコンポーネントを売っている会社は
COMの形式で出している事が多いと思います。特にMFCの拡張DLLの場合はコントロール系が多くなるのでCOMで公開している
ケースの方が多いのではないでしょうか。そうでなければ、オープンソースでソース毎公開しているかでしょう。
解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。- 回答としてマーク ひろ太 2009年9月2日 13:10
すべての返信
-
・市販ActiveXコンポーネントのような、「MFCによるコンポーネント」を作成・配布したい
・Release版MFCとリンクしたDLL(とヘッダ)のみ配布すればいいのでは
・そうすると、その配布をうけたユーザーがデバッグできない・debug版のdll(debug版MFCにリンク)を配布すると、デバッグ情報から元ソースの情報が漏れるのではという流れでしょうか。C++のクラスの入ったdllをバイナリのみで配布・メンテすること自体それなりに骨ですが(C++にはバイナリ互換がほとんどないからこそのCOM/ActiveXですし)、それを考慮済みというなら、Releaseのコード生成と同のコンパイルオプションを付けて、debug版MFCとリンクしたdll/libも配布する手があるとおもいますよ。
jzkey -
佐祐理さん、jzkeyさん返信ありがとうございます。>DebugのDLLを公開しないこととソースを公開しないこととどう繋がるのか理解できませんでした。
>どのような解釈から、両者が連動するとお考えなのでしょうか?>jzkeyさんが書かれた流れで合っています。Debug版DLLのデバッグ情報にはソースが含まれるものと思っていましたがそうではないのでしょうか?>C++のクラスの入ったdllをバイナリのみで配布・メンテすること自体それなりに骨ですが(C++にはバイナリ互換が>ほとんどないからこそのCOM/ActiveXですし)、それを考慮済みというなら>C++のクラスをDLLバイナリで配布というのは今まで何度もやっていることなので問題ないと思いますが、MFCクラスをDLLで公開するのは今回がはじめてなのでとまどっています。一般的にMFCクラスをDLLバイナリで配布している個人、企業はほとんどない?ようですね。 -
jzkeyさんが書かれた流れで合っています。Debug版DLLのデバッグ情報にはソースが含まれるものと思っていましたがそうではないのでしょうか?>C++のクラスの入ったdllをバイナリのみで配布・メンテすること自体それなりに骨ですが(C++にはバイナリ互換が>ほとんどないからこそのCOM/ActiveXですし)、それを考慮済みというなら>C++のクラスをDLLバイナリで配布というのは今まで何度もやっていることなので問題ないと思いますが、MFCクラスをDLLで公開するのは今回がはじめてなのでとまどっています。一般的にMFCクラスをDLLバイナリで配布している個人、企業はほとんどない?ようですね。
ですから、Debug版のDLLだけを公開してソースを配らないとDLLの中までデバッガで入る事は出来ません。
これに関しては実際に自分の環境で試してみれば、すぐにわかりますよ。
DLLの中にファイルの位置も持っているのでソースが入っているディレクトリを動かしてしまうと
自分の開発環境でもうまくデバッガで追えなくなるはずです。
jzkeyさんが書かれているようにDLLバイナリでの配布の場合、コンパイラのバージョンが合わないと問題になるので
各コンパイラのバージョン毎にDLLを用意するハメになりますよね。その部分の事を大変だと言われているのだと思います。
jzkeyさんが書かれているようにコンパイラのバージョン等を気にしなくても良いように一般的なコンポーネントを売っている会社は
COMの形式で出している事が多いと思います。特にMFCの拡張DLLの場合はコントロール系が多くなるのでCOMで公開している
ケースの方が多いのではないでしょうか。そうでなければ、オープンソースでソース毎公開しているかでしょう。
解決した時は、参考になったレスポンスの所にある[回答としてマーク]ボタンをクリックしてスレッドを締めましょう。- 回答としてマーク ひろ太 2009年9月2日 13:10