70

Winform アプリケーションでこのエラーが発生しています。このエラーが表示される理由と、さらに重要なことに、エラーを修正または回避する方法について、誰でも助けてもらえますか。

System.ComponentModel.Win32Exception: ウィンドウ ハンドルの作成中にエラーが発生しました。
   System.Windows.Forms.NativeWindow.CreateHandle (CreateParams cp) で
   System.Windows.Forms.Control.CreateHandle() で
   System.Windows.Forms.Control.CreateControl (ブール値の fIgnoreVisible) で
   System.Windows.Forms.Control.CreateControl() で
   System.Windows.Forms.Control.OnVisibleChanged (EventArgs e) で
   System.Windows.Forms.ButtonBase.OnVisibleChanged (EventArgs e) で
4

10 に答える 10

52

Process ExplorerまたはWindowsタスクマネージャーを実行して、GDIオブジェクト、ハンドル、スレッド、およびUSERオブジェクトを確認しましたか?そうでない場合は、表示する列を選択します(タスクマネージャーは[表示]-> [列の選択...]を選択します。次にアプリを実行し、そのアプリの列を調べて、そのうちの1つが本当に大きくなっていることを確認します。

クリーンアップされたと思われるが破棄されていないUIコンポーネントがある可能性があります。

これに関するリンクが役立つかもしれません。

幸運を!

于 2008-10-21T18:06:09.563 に答える
27

アプリケーションのウィンドウ ハンドルの制限は 10,000 ハンドルです。プログラムが作成するハンドルが多すぎるため、エラーが発生しています。メモリリークを見つける必要があります。他のユーザーが提案したように、Memory Profiler を使用してください。.Net Memory Profiler も使用します。また、フォームを閉じるにフォームからコントロールを削除する場合は、コントロールの dispose メソッドを呼び出していることを確認してください(そうしないと、コントロールは破棄されません)。また、コントロールにイベントが登録されていないことを確認する必要があります。私自身も同じ問題を抱えており、すでに知っていることにもかかわらず、まだいくつかのメモリリークがあり、それが私を逃れ続けています..

于 2008-11-21T21:38:49.183 に答える
11

「ウィンドウハンドルの作成エラー」と、それがUSERオブジェクトとデスクトップヒープにどのように関係しているかについての私の投稿を参照してください。私はいくつかの解決策を提供します。

于 2009-08-08T00:35:37.800 に答える
6

この問題は、ほとんどの場合、GDI オブジェクト カウント、ユーザー オブジェクト カウント、またはハンドル カウントに関連しており、通常はマシンのメモリ不足が原因ではありません。

これらのバグの 1 つを追跡しているときは、ProcessExplorer を開いて、ハンドル、スレッド、GDI オブジェクト、ユーザー オブジェクト、プライベート バイト、仮想サイズ、およびワーキング セットの列を監視します。

(私の経験では、問題は通常、イベント ハンドラーがオブジェクトを保持し、そのオブジェクトが破棄されないようにすることによるオブジェクト リークです。)

于 2010-02-08T14:36:27.650 に答える
2

私の場合、制御不能だったのは間違いなく USER オブジェクトでした。Windows タスク マネージャーを調べたところ、確かに、USER オブジェクトの数は正確に 10,000 でした。

プロパティ シートまたはリスト シートのコンテナ パネルの Parent プロパティをタブ ページのコンテナ パネルに設定することで、タブ ページにプロパティ シートとリスト シートを動的に埋め込んでいます。リストされているコレクションのタイプまたは検査されているオブジェクトのクラスタイプに応じて、プロパティとリストシートフォームを条件付きでリサイクルまたは再作成しています。

注: Delphi では、すべてのコントロールに Owner プロパティと Parent プロパティがありました。コントロールの Parent プロパティを変更した場合でも、所有しているコントロールが破棄されたときに、所有者によって破棄されます。

C# では、パネルなどのコントロールが、Panel.Parent プロパティを変更することによってフォームからタブ ページにプログラムによって再割り当てされた場合、フォームで Dispose() を呼び出してもパネルは破棄されず、コントロールも呼び出されないようです。タブページの .Clear()。Panel.Dispose() を直接呼び出しても、親が事前に手動で null に設定されていない限り、実際には破棄されません。

于 2010-03-18T12:38:47.463 に答える
1

アプリケーションで同じエラーが発生しました。単一ページに多くのコントロールをロードしています。ボタン クリック イベントで、コントロールをクリアしています。コントロールをクリアしても、メモリからコントロールが解放されません。そのため、メモリからコントロールを破棄します。controls.clear() メソッドにコメントし、コントロールを破棄するコードを数行含めました。このようなもの

controlcollection のコントロールとして各 ctl に対して

ctl.dispose()

于 2009-09-01T19:10:53.493 に答える
1

通常、コンピューターのメモリが不足しているため、これ以上ウィンドウ ハンドルを作成できません。通常、ウィンドウはこの時点でも奇妙な動作を示し始めます。

于 2008-10-21T17:13:34.413 に答える
1

私はそれを機能させるチェックを追加しました...

if (_form.Handle.ToInt32() > 0)
{
   _form.Invoke(method, args);
}

これは常に true ですが、それがないとフォームはエラーをスローします。ところで、私のハンドルは約490万です

于 2012-03-21T19:32:03.880 に答える
0

確かにハンドルが多すぎます (メモリ リークの問題):

IT ジャングル: System.ComponentModel.Win32Exception: ウィンドウ ハンドルの作成中にエラーが発生しました

于 2010-06-01T02:25:55.953 に答える
-2

メモリ不足の提案は、悪いリードのようには見えません。

このエラーが発生するためにプログラムは何をしていますか?

非常に多くのウィンドウまたはコントロールを作成していますか? 設計時ではなく、プログラムで作成しますか? もしそうなら、これをループで行いますか?そのループは無限ですか?他の方法で大量のメモリを消費していませんか?

タスク マネージャーでアプリケーションが使用するメモリを監視するとどうなりますか? それは月に急上昇しますか?または、上記で提案したように、プロセス モニターを使用して詳細に飛び込むこともできます。

于 2008-10-21T18:11:55.747 に答える