gpt4 book ai didi

delphi - ITaskService接口(interface)访问冲突

转载 作者:行者123 更新时间:2023-12-02 13:26:47 25 4
gpt4 key购买 nike

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

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

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

我使用的代码是:

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

该代码位于 TObject 的后代类中的单独单元中。即使没有对接口(interface)执行任何其他操作,这也足以导致 AV。 AV 发生在函数退出时,而不是在 Connect 行,因此它可能与对象的释放有关。

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

  • AV 仅在发布版本中发生,在调试中它可以正常工作
  • 如果我在“项目选项”>“编译”中关闭“优化”,则代码将再次运行。如果我在调试构建中打开它,代码将停止工作。
  • 如果我将其放置在主窗体的某个方法中,它会再次起作用。
  • 我调用了 CoInitialize,但没有任何效果
  • 我尝试在一个空白的新应用程序中复制它,但我做不到,因此它在某种程度上与应用程序中的另一个单元或类相关

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

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

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

最佳答案

我认为链接的 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;
...

关于delphi - ITaskService接口(interface)访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12376630/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com