やっと原因が分かりました。
[DLL の境界を越えて CRT オブジェクトを渡す場合に発生する可能性のあるエラー]
http://msdn2.microsoft.com/ja-jp/library/ms235460.aspx
Exe側でnewもdeleteもしているのですが、継承しているため、どちらかがDLLで実行され
ているということなのでしょうか。
問題となっているDLL,ExeはMFC DLLをスタティックリンクしており、共有DLLにすれば発
生しないという情報があり、試しにDLL、Exeとも共有DLLを使用するようにしたところ、
症状は起きなくなりました。スタティックリンクするとCRTライブラリに相違が生じるの
でしょうか。
どちらにしろ私の能力では危険が多そうなので、DLLをスタティックリンクライブラリに
しました。というかもともとスタティックリンクライブラリをDLLにしようとしていたの
で、今回はそれをやめることにしました。
おつきあいどうもありがとうございました。
ちなみにnewしていたのはメモリ量の問題ではなく、
ポリモルフィズムしていたので、動的に生成する必要がありました。
まあnewしなくてもいい方法もあるのかもしれませんが、
そうであってもdeleteするとエラーになるというのはちょっと嫌でした。
やっと原因が分かりました。
[DLL の境界を越えて CRT オブジェクトを渡す場合に発生する可能性のあるエラー]
http://msdn2.microsoft.com/ja-jp/library/ms235460.aspx
Exe側でnewもdeleteもしているのですが、継承しているため、どちらかがDLLで実行され
ているということなのでしょうか。
問題となっているDLL,ExeはMFC DLLをスタティックリンクしており、共有DLLにすれば発
生しないという情報があり、試しにDLL、Exeとも共有DLLを使用するようにしたところ、
症状は起きなくなりました。スタティックリンクするとCRTライブラリに相違が生じるの
でしょうか。
どちらにしろ私の能力では危険が多そうなので、DLLをスタティックリンクライブラリに
しました。というかもともとスタティックリンクライブラリをDLLにしようとしていたの
で、今回はそれをやめることにしました。
おつきあいどうもありがとうございました。
ちなみにnewしていたのはメモリ量の問題ではなく、
ポリモルフィズムしていたので、動的に生成する必要がありました。
まあnewしなくてもいい方法もあるのかもしれませんが、
そうであってもdeleteするとエラーになるというのはちょっと嫌でした。
MFCライブラリをスタティックリンクしてしまうと
各々でライブラリの初期化や状態の保持が行われてしまう為に
おかしくなると思います。
DLLで構成するのであれば、MFCもDLLで使うべきだと思います。
今回、MFC拡張DLLですよね。
PATIOさんのご意見どおり、共有DLLじゃないと駄目みたいですね。
古いですが
http://www.microsoft.com/japan/developer/library/vccore/_core_extension_dlls.3a
_.overview.htm
新しい方
http://msdn2.microsoft.com/ja-JP/library/20ytt2wa.aspx
ぐぐってみるとたくさんありますね
MSDNのほうがいいかと思ったので参考にどうぞ
古いほうが詳しく書いてそうですね。
情報ありがとうございます。
>今回、MFC拡張DLLですよね。
いや、プロジェクト作成時に「MFCをスタティックにリンクした通常のDLL」というのを
選択しました。
おそらくこれ↓ですね。
http://msdn2.microsoft.com/ja-JP/library/f22wcbea.aspx
中盤のこの記述が関連してそうですね。
-------------------------------------------------------
レギュラー DLL 内のメモリ割り当てはすべて、DLL の範囲内に収める必要があります。
したがって、以下のポインタを呼び出し側の実行可能ファイルとやり取りすることはで
きません。
MFC オブジェクトへのポインタ
MFC によって割り当てられたメモリへのポインタ
呼び出し元の実行可能ファイルと DLL との間で上のポインタや MFC 派生オブジェクト
をやり取りする場合は、拡張 DLL を作成する必要があります。
-------------------------------------------------------
今回は勉強になりました。ありがとうございます。