0

レガシーアプリケーションのプラグインを作成するには、ActiveXを使用する必要があります。いくつかの関連するスタンドアロン製品のコードベースを共有できるように、C#を使用しています。

SDKのテストコンテナ(TstCon32.exe)でコントロールをホストすると、すべてが正常に機能します。問題は、最初にコントロールをクリックしたときにターゲットアプリケーションにロードしようとすると、クリックしたアイテム(テキストボックスまたはデータグリッドセル)を除くすべてがコントロールグレーで塗りつぶされ、背景色を変更した場合です。他の何かへのコントロールは、背景が私が指定したのと同じ色のままですが、すべてのコントロールはまだコントロールグレーで覆われています(コンテナアプリから?)。追加のコントロールをクリックするとペイントされ、コントロールのサイズを変更するとすべてが再ペイントされます。最初のブランキングの後、次にコピーが作成されるまで、コントロールは正常に機能します。

4

1 に答える 1

1

私はついに解決策を見つけました。最初の部分は、ターゲットフレームワークを4.0から以前のバージョンに変更することでした。これにより、以前に消費されて私から隠されていたコントロールがブランクになったときに発生していた例外が明らかになりました。

System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at System.Windows.Forms.UnsafeNativeMethods.IOleInPlaceSite.OnUIActivate()
   at System.Windows.Forms.Control.ActiveXImpl.InPlaceActivate(Int32 verb)
   at System.Windows.Forms.Control.ActiveXImpl.OnFocus(Boolean focus)
   at System.Windows.Forms.Control.ChildGotFocus(Control child)
   at System.Windows.Forms.Control.OnGotFocus(EventArgs e)
   at System.Windows.Forms.Control.WmSetFocus(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

そこから、Googleサイドバーで発生したのと同じ問題に遭遇したtomasvdbによる投稿を見つけることができました。

このメッセージにリンクされたその投稿への返信の1つは、サイドバーアプリケーションが無効なデータを.netコントロールに送信していたバグの回避策を提供しました。

コントロールのVisibleChangedイベントハンドラーでその回避策メソッドを呼び出すと、私の問題も解決しました。

于 2010-08-11T17:47:59.743 に答える