【发布时间】: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