none
MFCアプリケーションでのWindowsFormControlのデシリアライズについて RRS feed

  • 質問

  • MFCアプリケーションでのWindowsFormControlのデシリアライズについて

    MFCアプリケーションで、VB.netで作成したWindowsFormContorlをシリアライズ、デシリアライズしようと悪戦苦闘しています。

    MFCアプリケーションのHeaderで

    CWinFormsControl<FormCtrlVB::FormCtrlVB> m_ctrl2;

    のように定義しているVB.netで作成した、WindowsFormControlを以下のようにシリアライズします。
    (とりあえずエラー処理は入れていません)

    System::IO::FileStream^ fs = gcnew System::IO::FileStream( "e:\\VBCtrl.dat",
    System::IO::FileMode::Create );
    System::Runtime::Serialization::Formatters::Binary::BinaryFormatter bf;

    try
    {
    bf.Serialize ( fs, m_ctrl2 );
    }
    __finally
    {
    fs->Close();
    }

    シリアライズは正常にできていることは確認できたのですが、このデータをデシリアライズすることができなくて困っています。
    VB.netを使用してデシリアライズできたときのソースを参考にMFCのデシリアライズのコードを色々と書いてみたのですが、コンパイルエラーが発生してうまくいきません。

    BinaryFormatterのDeserialize()の戻り値を利用して、CWinFormsControl<FormCtrlVB::FormCtrlVB>オブジェクトを生成したいのですが、castをすればいいのか、はたまた、他の方法なのか....。

    ご存知の方、いらっしゃいませんか?

    2010年2月17日 6:22

回答

  • 以下の流れでどうでしょうか。

    FormCtrlVB ^vbControl;

    vbControl = dynamic_cast<FormCtrlVB^>(bf.Deserialize(fs));

    if(vbControl != nullptr)
    {
      m_ctrl2.CreateManagedControl(vbControl,...);
    }

    dynamic_castの代わりにsafe_castを使えば、
    cast失敗時に例外を投げてくれます。

    try/catch/finallyを使用しましょう。
    • 回答としてマーク かばさん 2010年2月17日 23:34
    2010年2月17日 9:17

すべての返信

  • 以下の流れでどうでしょうか。

    FormCtrlVB ^vbControl;

    vbControl = dynamic_cast<FormCtrlVB^>(bf.Deserialize(fs));

    if(vbControl != nullptr)
    {
      m_ctrl2.CreateManagedControl(vbControl,...);
    }

    dynamic_castの代わりにsafe_castを使えば、
    cast失敗時に例外を投げてくれます。

    try/catch/finallyを使用しましょう。
    • 回答としてマーク かばさん 2010年2月17日 23:34
    2010年2月17日 9:17
  • kozzさん、ありがとうございました。

    一歩前に前進することができました。

    CWinFormsControl<FormCtrlVB::FormCtrlVB>で宣言していたので、
    このままを使用してcastをすることばかり考えていて、
    回答いただいたようなシンプルなコードに頭が切り替わらなかったのがいけなかったようです。

    まずは、FormCtrlVB::FormCtrlVBという固定のコントロールをデシリアライズして、
    貼り付けることができるようになりました。

    次は、
    ・任意の自作のコントロールを選択して貼り付ける。
    ・コントロール以外の情報と同じファイルにシリアライズの情報をのせる。
    等、色々課題はあるのですが、ようやくそちらに話を移せるようになりました。

    もし、これらの件に関してもご存知のことがありましたら教えてください。
    別の質問として作成したほうがいいようでしたら、別に作成しますので、指摘ください。

    2010年2月17日 23:45
  • >・任意の自作のコントロールを選択して貼り付ける。
    >・コントロール以外の情報と同じファイルにシリアライズの情報をのせる。
    もっと具体的にどういう過程になるか、何を調べてどううまくいかなかったのか、提示しましょうね。

    >別の質問として作成したほうがいいようでしたら、別に作成しますので、指摘ください。
    すでに回答マークがついていますので、
    上記情報を加えた上で、新規に質問を立ち上げたほうが良いですね。

    >MFCのデシリアライズのコードを色々と書いてみたのですが、コンパイルエラーが発生してうまくいきません。
    それから、こういう情報は大切ですよ。
    次からどういうCodeを書いて、どういうErrorになったか具体的に書きましょう。
    2010年2月18日 17:19