DLL中に記述したCTypedPtrListの利用

[戻る]
かど 2002/04/11(木) 20:04:23
初めて質問します。

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を使用を選択しています。

よろしくお願い致します。

dairygoods 2002/04/12(金) 09:44:43
VC++のDLLタイプを「拡張DLL」にしないと、
EXEとDLLの間でMFC(とその派生クラス)のポインタを
やり取りすることはできません。

MSDNの「DLL に関するトピック」に各DLLの違いが詳しく載っています。

かど 2002/04/12(金) 10:52:17
[[解決]]
ご指摘の通り、拡張DLLをでDLLを作成したところ、うまくいきました。

>MSDNの「DLL に関するトピック」に各DLLの違いが詳しく載っています。
よく読んで勉強します。

ありがとうございました。

不良PG 2002/04/12(金) 18:42:40
マルチポストした場合には、マルチポスト先にも解決の回答を書きましょうよ
レスがついてますよ。

ねぇ、kadotaさん?

かど 2002/04/13(土) 01:41:13
そうですね。ご忠告ありがとうございます。

古いスレッドには追加発言できません。