質問者
64 bit activeXのピクチャプロパティについて

質問
-
■開発環境
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
すべての返信
-
.NET の例外として ExternalException と表示され、例外の StackTrace(呼び出し履歴) には Picture プロパティから System.Drawing 名前空間のメソッドが見えるという認識で相違ないでしょうか。
(例外が発生した場合は、そのスタックトレースを提示することをおすすめします)推測に過ぎませんが、m_pic の作り方に問題がないかを疑っていきたいところです。
System.Drawing 名前空間で例外が発生するとすれば、COM のインターフェースとしての受け渡しが終わった後、画像データを .NET の Image クラス(具体的には GDI+ の Image クラス)などに変換使用とした際に問題が発生していると予想されます。この場合、画像が正しく作れていない可能性が疑われるためです。どのように作っているかを再調査していただくか、推測できる材料を提供していただくかが必要になると思います。
(もしかしたら外しているかもしれませんが)// x64/x86 で違うとしたらポインタ・ハンドル周りが疑われますが…。
-
先日、ビットマップで代用できるといったん解決済みにしたのですが、
それでは、客先のプログラムで書き換えが生じるケースがあることが判明しました。
そこで、メタファイルを返す方式を何とか修正したいと考えています。
■メタファイルの生成モジュールのコードです。(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回呼んでエラーになる場合もあります。
ご教授お願いします。