exception - Installshield:EnumServicesStatus 抛出异常问题

标签 exception prototype installshield

我是 installshield 的新手,现在遇到了问题。

请看下面的Windows定义:

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)是:

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;

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

最佳答案

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

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

关于exception - Installshield:EnumServicesStatus 抛出异常问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25759729/

相关文章:

JAVA - 线程中的异常 "main"java.lang.ArrayIndexOutOfBoundsException : 0

javascript - 可以共享作用域和访问实例的私有(private)原型(prototype)方法

file - 如何在使用 installshield 2010 安装过程中删除文件

java - 由 : java. util.NoSuchElementException 引起 - 在 Java 中使用迭代器?

android - 单击电子邮件链接时未找到处理 Intent 操作的 Activity 。查看

python - 在没有 "raise"语句的情况下引发 python 异常

Javascript 对象原型(prototype) TypeError : . .. 未定义

javascript - 方法完成时回调

windows-installer - 在安装过程中更改程序名称和快捷方式标题

registry - 批处理文件无法立即查看InstallShield脚本创建的环境变量