none
64 bit activeXのピクチャプロパティについて RRS feed

  • 質問

  • ■開発環境
    Visual Studio 2010 C++(ActiveX)
    Visual Studio 2010 C#, VB.net(呼び出す側)
    Windows 7 64bit OS

    ■内容
    ActiveXコントロールを、VB.net 及びc#で呼び出したいと考えています。
    他のプロパティや32bitの場合ははうまく渡せたのですが、64bitのPictureプロパティがうまく渡せません。
    表示されるエラー内容は、C#, VB.net共に下記内容です
     ExternalExceptionはハンドルされませんでした。GSI+で汎用エラーが発生しました
     'System.Runtime.InteropServices.ExternalException' の初回例外が System.Drawing.dll で発生しました。

    実装は、下記URLを参考にして作成しました。
    http://msdn.microsoft.com/ja-jp/library/1exs6wht(v=vs.100).aspx

    ■ソースコード
    [ActiveX側のソース]
    BEGIN_DISPATCH_MAP(CMyAxPicCtrl, COleControl)
    DISP_PROPERTY_EX(CMyAxPicCtrl, "Picture", GetPicture, SetPicture, VT_PICTURE)
    END_DISPATCH_MAP()

    void CMyAxPicCtrl::DoPropExchange(CPropExchange* pPX)
    PX_Picture(pPX, _T("Picture"), m_pic); //ピクチャ型のプロパティをシリアル化する。
    }

    LPPICTUREDISP CMyAxPicCtrl::GetPicture() {
    return m_pic.GetPictureDispatch();
    }

    [呼び出す側(C#)]
    private void button1_Click(object sender, System.EventArgs e) {
    PictureBox1.Image = axCMyPic1.Picture;
    }

    [呼び出す側(VB.Net)]
    Private Sub Command1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Command1.Click
    Picture1.Image = axCMyPic1.Picture
    End Sub

    ActiveX、呼び出す側のどちらが悪いのか、どうやったら修正できるのか、
    どなたかご存知の方がおられればご教授の程、宜しくお願い致します。

    • 編集済み yuichi00 2013年2月25日 1:18
    2013年2月25日 1:12

すべての返信

  • .NET の例外として ExternalException と表示され、例外の StackTrace(呼び出し履歴) には Picture プロパティから System.Drawing 名前空間のメソッドが見えるという認識で相違ないでしょうか。
    (例外が発生した場合は、そのスタックトレースを提示することをおすすめします)

    推測に過ぎませんが、m_pic の作り方に問題がないかを疑っていきたいところです。
    System.Drawing 名前空間で例外が発生するとすれば、COM のインターフェースとしての受け渡しが終わった後、画像データを .NET の Image クラス(具体的には GDI+ の Image クラス)などに変換使用とした際に問題が発生していると予想されます。この場合、画像が正しく作れていない可能性が疑われるためです。

    どのように作っているかを再調査していただくか、推測できる材料を提供していただくかが必要になると思います。
    (もしかしたら外しているかもしれませんが)

    // x64/x86 で違うとしたらポインタ・ハンドル周りが疑われますが…。

    • 回答としてマーク yuichi00 2013年2月27日 13:20
    • 回答としてマークされていない yuichi00 2013年3月1日 0:05
    2013年2月25日 13:34
    モデレータ
  • Azuleanさん

    ご指摘いただいた通り、ocx側の画像がおかしかったです。

    m_picを作成するためメタファイルを使いcreateFromMetafileで作成していたのを、ビットマップを使いcreateFromBitmapで作成することで無事動作しました。

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

    2013年2月27日 13:32
  • 先日、ビットマップで代用できるといったん解決済みにしたのですが、

    それでは、客先のプログラムで書き換えが生じるケースがあることが判明しました。

    そこで、メタファイルを返す方式を何とか修正したいと考えています。

    ■メタファイルの生成モジュールのコードです。(ActiveX側)

    32bitはうまく動作しますが、64bitではうまく動作しません。

    IPictureDisp* CMyAxPicCtrl::GetControlPicture(void)

    {

    AFX_MANAGE_STATE(AfxGetStaticModuleState());

    /*メタファイル生成*/

    CMetaFileDC mfDC;

    VERIFY(mfDC.Create());

    mfDC.SetMapMode(MM_ANISOTROPIC);

    mfDC.SetWindowExt(100, 100);

    mfDC.SetWindowOrg(0, 0);


    /*描画*/

    mfDC.MoveTo(0,0);

    mfDC.LineTo(100,100);

    HMETAFILE m_hmf = mfDC.Close();

    m_pic.CreateFromMetafile(m_hmf, 100, 100, FALSE);

    return m_pic.GetPictureDispatch();

    }


    ■エラーの内容は下記です。(VB.net側)

    ************** 例外テキスト **************

    System.Runtime.InteropServices.ExternalException (0x80004005): GDI+ で汎用エラーが発生しました。
       場所 System.Drawing.Imaging.Metafile..ctor(IntPtr hmetafile, WmfPlaceableFileHeader wmfHeader, Boolean deleteWmf)

       場所 System.Windows.Forms.AxHost.GetPictureFromParams(Object pict, IntPtr handle, Int32 type, IntPtr paletteHandle, Int32 width, Int32 height)

       場所 System.Windows.Forms.AxHost.GetPictureFromIPicture(Object picture)

       場所 SampleVB.Form1.Button1_Click(Object sender, EventArgs e) 場所 E:¥Users¥user¥Desktop¥SampleVB2010¥SampleVB¥Form1.vb:行 69

       場所 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)

       場所 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)

       場所 System.Windows.Forms.Control.WndProc(Message& m)

       場所 System.Windows.Forms.ButtonBase.WndProc(Message& m)

       場所 System.Windows.Forms.Button.WndProc(Message& m)

       場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

    Button1_Clickを1回呼んだらエラーになる場合もありますし、10回呼んでエラーになる場合もあります。

    ご教授お願いします。

    2013年3月1日 0:03
  • 私の方は情報を持っていないため、回答できませんので、どなたかの追加情報待ちでお願いします。
    (64bit ActiveX でさらに IPictureDisp でメタファイルを扱っている事例がどの程度わるのかわかりませんが…)

    2013年3月2日 12:12
    モデレータ