Installshield:EnumServicesStatus抛出异常问题

时间:2014-09-10 07:33:19

标签: exception prototype installshield

我是一个更新的installshield,现在,我遇到了一个问题。

请查看以下Wi​​ndows定义:

BOOL WINAPI EnumServicesStatus(
  _In_         SC_HANDLE hSCManager,
  _In_         DWORD dwServiceType,
  _In_         DWORD dwServiceState,
  _Out_opt_    LPENUM_SERVICE_STATUS lpServices,
  _In_         DWORD cbBufSize,
  _Out_        LPDWORD pcbBytesNeeded,
  _Out_        LPDWORD lpServicesReturned,
  _Inout_opt_  LPDWORD lpResumeHandle
);

我的installshield脚本中的原型是:

prototype BOOL AdvAPI32.EnumServicesStatus(INT,INT,INT,POINTER,INT,POINTER,POINTER,POINTER);

功能过程:

INT mgrHandle;
NUMBER nSize, nRet;
POINTER lpServices;

begin

    nSize = 0;
    nRet = 0;

try          AdvAPI32.EnumServicesStatus(mgrHandle,SERVICE_WIN32,SERVICE_STATE_ALL,lpServices,1024,&nSize,&nRet,NULL);

catch  
    MessageBox (FormatMessage(Err.LastDllError), WARNING);    
endcatch;

它抛出异常,消息框显示:操作成功完成。 我不知道出了什么问题?任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

这里的核心问题可能是由于您准备和传递lpServices参数的方式。根据MSDN在EnumServicesStatus上的条目,它是"指向缓冲区的指针,该缓冲区包含接收[数据]的ENUM_SERVICE_STATUS结构数组。"这就是文档说话,告诉你分配一块内存并传递它的地址。之后,如果函数成功,该块将包含一组格式为ENUM_SERVICE_STATUS structures的数据。

从API的角度来看,您缺少的关键部分是该缓冲区的分配。您已经告诉它,从lpServices中的值开始有1024字节的已分配内存,但您实际上并未分配任何此类内存,甚至也未将lpServices设置为指向已知位置。但是EnumServicesStatus无法知道这一点,并会盲目地做你所说的。根据所讨论的实际值,异常很可能是由写入不存在的缓冲区引起的,并且该函数没有机会返回错误代码。

答案 1 :(得分:0)

也许查看Stefan Kruger的http://www.installsite.org。以下是有关Installscript和服务的部分:http://www.installsite.org/pages/en/isp_svc.htm