我是 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/