初めて質問します。
DLLでCTypedPtrListを定義したクラスをエクスポートして、ExeでSelializeによるフ
ァイルの読み書きを行いたいのですが、読み込みが行えません。
テストでちいさなプログラムを作成して行ってみたんですが、同様のエラーで読み込みが
行えませんでした。
ちょっとそのプログラムをかいつまんで書いてみます。
DLL側にCObjectから派生したクラスA,Bを作成します。
Aは下みたいな感じです。
(DLL_EXPORTは__declspec(dllexport)と__declspec(dllimport)の切り替え)
class DLL_EXPORT A : public CObject
{
public:
int x,y;
CTypedPtrList<COblist,CObject*> m_list;
DECLARE_SERIAL( A )
virtual void Serialize( CArchive& );
A(){}
~A(){}
}
クラスBは、CTypedPtrListのメンバを持っていないだけでAと同じクラス構成のものを
作成しています。
次に、クラスAのソース側を以下のように記述します。
IMPLEMENT_SERIAL( A,CObject,1)
void A::Serialize( CArchive& ar )
{
CObject::Serialize( ar );
if( ar.IsStoring() ){
ar << x << y;
}
else{
ar >> x >> y;
}
m_list.Serialize(ar)
}
でExe側でDLLを呼んで、m_listにtestBをAddtailして追加します。
ファイルの書き込みはできる(正しいかは?)んですけど、
そのファイルを読み込むとm_list.Serialize(ar)で
Cannot load B from archive. Class not defined.という警告のあと落ちてしまいます。
実行環境は、VCの6.0でWIN2000です。
MFCの共有DLLを使用を選択しています。
よろしくお願い致します。
VC++のDLLタイプを「拡張DLL」にしないと、
EXEとDLLの間でMFC(とその派生クラス)のポインタを
やり取りすることはできません。
MSDNの「DLL に関するトピック」に各DLLの違いが詳しく載っています。
ご指摘の通り、拡張DLLをでDLLを作成したところ、うまくいきました。
>MSDNの「DLL に関するトピック」に各DLLの違いが詳しく載っています。
よく読んで勉強します。
ありがとうございました。
マルチポストした場合には、マルチポスト先にも解決の回答を書きましょうよ
レスがついてますよ。
ねぇ、kadotaさん?
そうですね。ご忠告ありがとうございます。