3

タスク スケジューラのインターフェイスに特有の問題があり、誰かが助けてくれたらとてもうれしいです。

私のアプリケーションの一部は、タスク スケジューラから項目を読み取ります。XP では、JEDI ライブラリのユニットからタスク スケジューラ v1.0 インターフェイスを使用します。Vista と Win7 では、この記事にある TaskSchd.pas ユニットを使用しました。これには、新しい 2.0 インターフェイスの定義が含まれています。Delphi XE2 Update 4 を使用しています。

問題は、ITaskService インターフェイスの Connect メソッドを呼び出すと、アクセス違反が発生することです。エラー メッセージは、「$0055C73C で最初の例外が発生しました。メッセージ '0x0055c73c でのアクセス違反: アドレス 0x0000000b の読み取り' を伴う例外クラス $C0000005」です。

私が使用するコードは次のとおりです。

procedure TSomeClass.TaskScheduler(...);
var
  TS : ITaskService;
  TaskFolder : ITaskFolder;
begin
  TS := CoTaskScheduler.Create();
  TS.Connect('', '', '', '');
  ......
end;

コードは、TObject から派生したクラスの別のユニットにあります。これは、インターフェイスで他に何もしなくても、AV を引き起こすのに十分です。ただし、Connect ラインではなく、関数が終了したときに AV が発生するため、オブジェクトの解放に関連している可能性があります。

いくつかのテストを実行しましたが、問題がどこにあるかを見つけることができませんでした。奇妙なのは次のとおりです。

  • AV はリリース ビルドでのみ発生し、デバッグでは正常に動作します。
  • [プロジェクト オプション] > [コンパイル] で最適化をオフにすると、再びコードが機能します。デバッグ ビルドでオンにすると、コードが機能しなくなります。
  • これをメインフォームのメソッドに配置すると、再び機能します。
  • CoInitialize を呼び出しましたが、何の効果もありません
  • 空白の新しいアプリで複製しようとしましたが、できなかったので、アプリケーション内の別のユニットまたはクラスに何らかの関連があります

インターフェイスについて欠けているのはおそらく非常に単純なものですが、見つけることができませんでした。それ以外の場合、コードは機能します。タスクのリストを取得して表示できます。この問題は、[コンパイル] > [最適化] オプションがオンになっている場合に発生します。これは、リリース ビルドのデフォルトです。

1 つの解決策は、最適化をオフにすることですが、問題の原因を見つけたいと思います。

編集: AV、CoInitialize、Delphi、および ITaskService ヘッダー ファイルに関する追加情報を含めました。

4

3 に答える 3

1

リンクされた Taskschd.pas には多くのバグがあると思います。

たとえば、ITaskFolder::CreateFolder には 2 つのパラメーターしかありませんが、Windows タスク スケジューラ 2.0 API にはツリー パラメーターがあります。

「Connect」についての質問に戻ります。私は次のコードを使用しています:

var
  TaskService: ITaskService;
begin
  if (Succeeded(CoInitialize(nil))) then
  begin
    if (Failed(CoCreateInstance(CLSID_TaskScheduler, nil, CLSCTX_INPROC_SERVER, IID_ITaskService, TaskService))
      or (Failed(TaskService.Connect(Null, Null, Null, Null)))) then
    begin
      CoUninitialize();
      TaskService := nil;
    end;
  end;
...
于 2012-09-30T06:56:59.963 に答える
0

私もこの問題を抱えています。理由 - 間違ったヘッダー TaskSchd.pas は次を使用します: https://searchcode.com/codesearch/view/27081108/

于 2015-10-16T20:33:46.210 に答える
-1

結局これを作るだけです:

ts:= nil;
于 2014-09-22T08:27:11.117 に答える