3

我对任务计划程序界面有一个特殊的问题,如果有人可以提供帮助,我会非常高兴。

我的应用程序的一部分从任务计划程序中读取项目。在 XP 下,我使用来自 JEDI 库的单元的 Task Scheduler v1.0 接口。在 Vista 和 Win7 下,我使用了本文中的 TaskSchd.pas 单元。它包含新 2.0 接口的定义。我使用 Delphi XE2,更新 4。

问题是当我调用 ITaskService 接口的 Connect 方法时出现访问冲突。错误消息是“$0055C73C 处的第一次机会异常。异常类 $C0000005 带有消息‘在 0x0055c73c 处的访问冲突:读取地址 0x0000000b’。”

我使用的代码是:

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

该代码位于 TObject 的子类中的一个单独单元中。这足以引起 AV,即使没有对界面做任何其他事情。AV 发生在函数退出时,而不是在 Connect 行,因此它可能与对象的释放有关。

我进行了一些测试,但找不到问题所在。这是奇怪的:

  • AV 仅在 Release 版本中发生,在 Debug 中它可以正常工作
  • 如果我在“项目选项”>“编译”中关闭“优化”,那么代码将再次起作用。如果我在调试版本中打开它,代码将停止工作。
  • 如果我将它放在主窗体中的某种方法中,它会再次起作用。
  • 我已经调用了 CoInitialize,但它没有任何效果
  • 我试图在一个空白的新应用程序中复制它,但我做不到,所以它与应用程序中的另一个单元或类有关

关于接口我可能缺少一些非常简单的东西,但我一直找不到它。否则代码可以工作,我可以获取并显示任务列表。当编译 > 优化选项打开时出现问题,这是发布版本的默认设置。

一种解决方案是关闭优化,但我宁愿找到问题的原因。

编辑:我已经包含了关于 AV、CoInitialize、Delphi 和 ITaskService 头文件的附加信息。

4

3 回答 3

1

我认为链接的 Taskschd.pas 有很多错误。

例如,ITaskFolder::CreateFolder 只有两个参数,但在 Windows Task Scheduler 2.0 API 中有树形参数。

回到你关于“连接”的问题。我正在使用以下代码:

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 回答