1

VB6 exe としてコンパイルされた VB6 プロジェクトがあります。

起動オブジェクトとして単純なフォームを持っています。

regasm された .NET dll を介して .NET モーダル フォームを起動し、コールバック COM インターフェイス (IHandler) の実装を渡します。

.NET は VB6 の IHandler 実装にコールバックします。

VB6 は、vbModal を使用して新しいフォームを表示しようとします。VB6 フォームは、モーダル .NET フォームがまだ表示されているため、操作がブロックされています。

これまたは推奨されるアプローチを回避する方法はありますか?

新しい (STA) (マネージド) スレッドで VB6 にコールバックしようとしましたが、MyCallbackForm.Show vbModal を実行しようとすると、「無効なプロシージャ コールまたは引数です。」というメッセージが表示されます。新しいスレッドでコールバックしていること...


更新: VB6 プロジェクト タイプを ActiveX exe に設定した場合、新しいスレッドでコールバックを正常に作成し、VB6 フォームをモーダルに表示することができました...しかし、それを行うと、コールバックでスレッドが失われたように見えました。 VB6 から .NET へのその後の呼び出しで、クロス スレッド例外が発生しました。これは、ActiveX exe を使用するときのスレッド モデルに関係していると思います。

4

2 に答える 2

0

VB6EXEプロジェクトを2つのプロジェクトに分割できます。
プロジェクト1は、現在のVB6プロジェクトから、.NetDLLから表示できるようにするサブフォームを除いたものです。プロジェクト2はVB6ActiveXDLLプロジェクトであり、.Netdllから表示できるようにするサブフォームが含まれている必要があります。

したがって、次の代わりに次のようにします。1.VB6.exeプロジェクトがIHandlerを渡す.NetDLLを呼び出す2..NetプロジェクトがIHandlerの関数を呼び出す3.IHandler(VB6実装)がサブフォームを表示しようとしますが、運がありません。

1.VB6.exeプロジェクトは.NetDLLを呼び出し、サブフォームがメインプロジェクトから必要なデータを渡します。2。.Netプロジェクトは、サブフォームを含むActiveX DLLの「ShowYourSelf」関数を呼び出し、データを渡します。必要です。

于 2012-07-04T08:15:57.987 に答える
0

VB6 アプリケーションでモードレス .NET コントロールを使用してフォームを表示できますが、次のようにする必要があります。

  • フォーム上にある必要があるすべてのコンテンツを含む .NET ユーザー コントロールを作成します。
  • MS InteropToolkitを使用して COM 可視ユーザー コントロールを簡単に作成し、そのコントロールをユーザー コントロールから継承させます (最初の手順をスキップして、ユーザー コントロールを直接可視にすることもできます)。
  • VB6 プロジェクトで新しいフォームを作成し、それに COMVisible .NET ユーザー コントロールを追加します。
于 2012-07-04T08:02:10.503 に答える