2

この問題をきちんと説明できることを願っています!

ReWire オーディオ デバイスを Delphi .dll として実装しようとしています。ReWire が何であるかを知らなくても、心配する必要はありません。重要なのは、私のコードが .dll にコンパイルされることです。ReWire システムから私の .dll への呼び出しを取得して、ディスプレイを開き、ディスプレイが開いているかどうかを確認し、再度閉じます。

起動の呼び出しを受け取ったら、次のことを行います。

  if not Assigned(form) then
    form := TMyForm.Create(nil);
  form.Show;

私の Delphi ライブラリ内のグローバル変数formはどこですか (おそらく問題ですか?)。のイベントを接続して、作業したいものの配列を準備するなど、いくつかの興味深いことを行いました。MyFormOnCreate

これまでのところ、すべて順調です。私のフォームには、TOpenDialog. そのダイアログが閉じるとすぐに、どういうわけかOnCreateイベントが私のフォームで再び発生していることに気付きました!

OnDestroyが呼び出されていないことを確認したので、OnCreate再度呼び出される理由がわかりません。

残念ながら、どの情報が関連しているかはよくわかりませんが、最初の呼び出しスタック (フォームが最初に設定されたとき) は次のとおりです。

最初のコール スタック

予想どおり、ReWire は私の .dll を呼び出して Panel アプリケーションを起動しているので、フォームを作成します。よかった、物事は順調に進んでいる。

次に、フォーム内で小さなダイアログを開き、ファイルを選択して、いくつかの操作を行います。左のフィールドから、OnCreate再び呼び出されます。その時のコール スタックは次のとおりです。

2 番目のコール スタック

それは電話のクレイジーなパーティーです!Reaper (一番下) は、アプリケーションをテストするために使用している ReWire ホストですが、そのスタック トレース内で何が起こっているのかわかりません。これは私のコードではないためです。突然、呼び出されなかったので、そうすべきではないと思うときにイベントが呼び出さOnDestroyれます。

私が考えることができる唯一の他の重要なことは、のアドレスを出力するとSender、毎回異なるため、どういうわけかCreatedを再度取得するか何かですが、MyForm.Createを1回だけ呼び出すことを確認しました。

この種のことがどのように起こるかについてのアイデアはありますか?

4

2 に答える 2

4

最初のスタック トレースでは、OnCreate呼び出しの前に への呼び出しがありますがTCustomForm.Create()、これは正しい動作です。2 番目のスタック トレースでは、OnCreate呼び出しの前にTObject.Create()代わりに呼び出しが行われていますが、これは正しい動作ではありません。これにより、ボタン イベント ハンドラーの何かがOnClick不適切な VMT を使用してオブジェクトを構築しているか、一般的にメモリを破損しており、たまたまクラスによって占有されているコードに不適切なジャンプが発生していると考えられますTFormOnClickいずれにせよ、バグがないかロジックを再確認してください。

于 2012-04-30T04:30:15.623 に答える
1

フォーム変数をnilに設定している(任意の)場所をチェックしてください。指しているフォームを解放せずに nil に設定されている可能性があるため、次に起動コードが呼び出されると、フォームの別のインスタンスが作成されます。

于 2012-04-30T02:50:48.667 に答える