【问题标题】:ITaskService interface Access ViolationITaskService 接口访问冲突
【发布时间】:2012-09-04 19:00:21
【问题描述】:

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

我的应用程序的一部分从任务计划程序中读取项目。在 XP 下,我使用来自 JEDI 库的单元的 Task Scheduler v1.0 接口。 在 Vista 和 Win7 下,我使用了 this article 中的 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 中正常工作
  • 如果我在“项目选项”>“编译”中关闭“优化”,代码将再次起作用。如果我在 Debug build 中打开它,代码将停止工作。
  • 如果我将它放在主窗体中的某个方法中,它会再次起作用。
  • 我调用了 CoInitialize,但没有任何效果
  • 我试图在一个空白的新应用程序中复制它,但我不能,所以它与应用程序中的另一个单元或类有某种关系

关于接口我可能缺少一些非常简单的东西,但我一直无法找到它。 否则代码可以工作,我可以获取并显示任务列表。当 Compiling > Optimizations 选项打开时出现问题,这是 Release 构建的默认设置。

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

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

【问题讨论】:

  • 当您说“我遇到访问冲突”并且没有提供有关访问冲突的信息时,您不妨说“它不起作用”,因为它们的含义相同。当您键入“错误”或“异常”时,接下来您应该提供准确的错误消息,包括任何错误代码或内存地址。
  • 你试过用EmptyParam代替空白字符串吗? ITaskService.Connect() 的参数是变量值,不是字符串。
  • 破解程序,直到找到涉及的其他代码段
  • 抱歉在匆忙中遗漏了一些信息。我在主帖中添加了 AV 信息和 Delphi(它是 XE2)版本。我尝试过使用和不使用 CoInitialize,也尝试过 EmptyParam,但没有区别。
  • XE2 的哪个更新。他们在更新 2 中修复了一个令人讨厌的 COM 错误:stackoverflow.com/questions/7886116/… 但这可能是一个长镜头

标签: delphi interface scheduled-tasks


【解决方案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;
...

【讨论】:

    【解决方案2】:

    我也有这个问题。 原因 - 错误的标头 TaskSchd.pas 使用以下内容:https://searchcode.com/codesearch/view/27081108/

    【讨论】:

    • 请解释你的答案。
    • 感谢您的建议。我正在做的那个项目很久以前就完成了,不再开发了。我现在无法测试这个单元,但如果我需要再次使用任务计划程序,我会记住这一点。
    • αƞjiβ,只是不要使用标题TaskSchd.pas,指定的问题。它有一些错误。使用来自searchcode.com/codesearch/view/27081108的TaskSchd.pas
    【解决方案3】:

    毕竟做这个:

    ts:= nil;
    

    【讨论】:

      猜你喜欢
      • 2015-01-26
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 2017-05-06
      • 2013-02-26
      • 2015-04-23
      相关资源
      最近更新 更多