Pointers Inno安装Windows DLL函数调用,指针指向结构

Pointers Inno安装Windows DLL函数调用,指针指向结构,pointers,inno-setup,Pointers,Inno Setup,我正在尝试使用Inno Setup的Pascal脚本语言设置服务的失败操作。我收到典型的“地址访问冲突…”错误。似乎这是不可能的,因为该语言不支持指针。有什么想法吗?以下是代码片段: 类型 行动=记录 aType1:长单词; 延迟1:长单词; aType2:长单词; 延迟2:长单词; aType3:长单词; 延迟3:长单词; 结束; 类型 TServiceFailureActionsA=记录 德沃德:德沃德; pRebootMsg:String; pCommand:字符串; 计算:德沃德; 行动

我正在尝试使用Inno Setup的Pascal脚本语言设置服务的失败操作。我收到典型的“地址访问冲突…”错误。似乎这是不可能的,因为该语言不支持指针。有什么想法吗?以下是代码片段:

类型
行动=记录
aType1:长单词;
延迟1:长单词;
aType2:长单词;
延迟2:长单词;
aType3:长单词;
延迟3:长单词;
结束;
类型
TServiceFailureActionsA=记录
德沃德:德沃德;
pRebootMsg:String;
pCommand:字符串;
计算:德沃德;
行动:行动;
结束;
函数ChangeServiceConfig2(hs服务:Longword;dwInfoLevel:Longword;lpInfo:TServiceFailureActionsA):BOOL;
外部的ChangeServiceConfig2A@advapi32.dllstdcall';
过程SimpleChangeServiceConfig(AService:string);
变量
SCMHandle:长单词;
servicehold:Longword;
sfActions:TServiceFailureActionsA;
动作:动作;
开始
尝试
SCMHandle:=OpenSCManager('','',SC_MANAGER_ALL_ACCESS);
如果SCMHandle=0,则
RaiseException('SimpleChangeServiceConfig@OpenSCManager:“+AService+”+
SysErrorMessage(DLLGetLastError));
尝试
ServiceHandle:=OpenService(SCMHandle、AService、SERVICE\u ALL\u访问);
如果ServiceHandle=0,则
RaiseException('SimpleChangeServiceConfig@OpenService:“+AService+”+
SysErrorMessage(DLLGetLastError));
尝试
sActions.aType1:=SC\u ACTION\u RESTART;
sActions.Delay1:=60000;//First.nDelay:以毫秒为单位,MMC以分钟为单位显示
sActions.aType2:=SC\u ACTION\u RESTART;
sActions.Delay2:=60000;
sActions.aType3:=SC\u ACTION\u RESTART;
sActions.Delay3:=60000;
sfActions.dwResetPeriod:=1;//以秒为单位,MMC以天为单位显示
//sfActions.pRebootMsg:=null;//重新启动消息未更改
//sfActions.pCommand:=null;//命令行未更改
sfActions.cActions:=3;//第一次、第二次和后续故障
sfActions.saActions:=saActions;
如果不是,则更改ServiceConfig2(
ServiceHandle,//句柄到服务
服务\u配置\u失败\u操作,//更改:说明
sfActions)//新的描述
然后
RaiseException('SimpleChangeServiceConfig@ChangeServiceConfig2:“+AService+”+
SysErrorMessage(DLLGetLastError));
最后
如果ServiceHandle为0,则
CloseServiceHandle(ServiceHandle);
结束;
最后
如果SCMHandle为0,则
关闭服务手柄(SCM手柄);
结束;
除了
ShowExceptionMessage;
结束;
结束;

尝试在lpInfo参数的声明中使用var关键字,以指定将指向结构的指针传递给函数。

脚本中有两个问题。就像Deanna建议的那样,您必须在
lpInfo
参数的声明中使用
var
关键字

您还需要将
TScAction
类型更改为包含两个元素的数组

这是我的脚本,您可以将其包含在Inno安装脚本中

const
服务配置延迟自动启动信息=3//lpInfo参数是指向服务\u延迟\u自动\u启动\u信息结构的指针。
//Windows Server 2003和Windows XP:不支持此值。
服务配置描述=1//lpInfo参数是指向服务描述结构的指针。
服务配置失败动作=2//lpInfo参数是指向服务\u故障\u操作结构的指针。
//如果服务控制器处理SC_操作_重新启动操作,则调用者必须具有
//SE_SHUTDOWN_NAME权限。有关详细信息,请参阅以特殊权限运行。
服务配置失败动作标志=4//lpInfo参数是指向服务\u故障\u操作\u标志结构的指针。
//Windows Server 2003和Windows XP:不支持此值。
服务配置首选节点=9//lpInfo参数是指向服务\首选\节点\信息结构的指针。
//Windows Server 2008、Windows Vista、Windows Server 2003和Windows XP:不支持此值。
服务配置预关机信息=7//lpInfo参数是指向服务\u预关闭\u信息结构的指针。
//Windows Server 2003和Windows XP:不支持此值。
服务配置所需权限信息=6//lpInfo参数是指向服务所需的特权信息结构的指针。
//Windows Server 2003和Windows XP:不支持此值。
服务配置服务SID信息=5//lpInfo参数是指向服务SID INFO结构的指针。
服务配置触发信息=8//lpInfo参数是指向服务触发信息结构的指针。
//ANSI版本的ChangeServiceConfig2不支持此值。
//Windows Server 2008、Windows Vista、Windows Server 2003和Windows XP:在Windows Server 2008 R2之前不支持此值。
SC_ACTION_NONE=0;//没有行动。
SC_操作_重新启动=2;//重新启动计算机。
SC_ACTION_RESTART=1;//重新启动服务。
SC_ACTION_RUN_命令=3;//运行命令。
类型
行动=记录
aType1:长单词;
延迟1:长单词;
结束;
类型
TServiceFailureActionsA=记录
dwR