论坛风格切换切换到宽版
  • 3726阅读
  • 4回复

请教使用Inno打包执行服务的操作OpenService返回总是0,这是为什么? [复制链接]

上一主题 下一主题
离线yiyeshu2012
 

发帖
17
金钱
170
威望
17
只看楼主 倒序阅读 0 发表于: 2014-12-12
Const
  SC_MANAGER_ALL_ACCESS = $F003F;
  SERVICE_ALL_ACCESS = $F01FF;


function OpenSCManager(lpMachineName, lpDatabaseName: String; dwDesiredAccess: Cardinal): Cardinal;
    External 'OpenSCManagerA@advapi32.dll stdcall';


function OpenService(hSCManager: Cardinal; lpServiceName: String; dwDesiredAccess: Cardinal): Cardinal;
    External 'OpenServiceA@advapi32.dll stdcall';


function CloseServiceHandle(hSCObject: Cardinal): Boolean;
    External 'CloseServiceHandle@advapi32.dll stdcall';


function OpenServiceManager(): Cardinal;
begin
    if UsingWinNT() then
    begin
        result := OpenSCManager('','',SC_MANAGER_ALL_ACCESS);
        if result = 0 then
            MsgBox('the servicemanager is not available', mbError, MB_OK)
    end else begin
        MsgBox('only nt based systems support services', mbError, MB_OK)
        result := 0;
    end;
end;


function IsServiceInstalled(ServiceName: string): Boolean;
var
    hSCM : Cardinal;
    hService: Cardinal;
begin
    result := false;
    hSCM := OpenServiceManager();
    //变量输出
    Log('The Value is: ' + IntToStr(hSCM)); //这里有值返回
    if hSCM <> 0 then
    begin
        hService := OpenService(hSCM,ServiceName,SERVICE_ALL_ACCESS);
        //变量输出
        Log('The Value is: ' + IntToStr(hService));//这里就返回零了,不管用已经装好的任何一个服务测试都一样
        if hService <> 0 then
        begin
            result := true;
            CloseServiceHandle(hService)
        end;
        CloseServiceHandle(hSCM)
    end;
end;


function InitializeSetup(): Boolean;
var
    ResultCode: Integer;
begin
    result := true;
    if IsServiceInstalled('MySQL') then
    begin
        MsgBox('成功', mbError, MB_OK)
    end else begin
        MsgBox('失败', mbError, MB_OK)
    end;
end;

我的操作系统是xp
调用OpenServiceManager可以返回句柄
查询的是MySQL服务肯定是存在的


就是这段代码谁能帮忙执行一下
看看在你们的系统上对么


离线yiyeshu2012

发帖
17
金钱
170
威望
17
只看该作者 1 发表于: 2014-12-12
执行这个打开服务的时候就返回0
我换了很多服务名称都一样
OpenService(hSCM,'MySQL',SERVICE_ALL_ACCESS);
离线yiyeshu2012

发帖
17
金钱
170
威望
17
只看该作者 2 发表于: 2014-12-12
哈哈
我就疯了
折腾了好几天的问题
原来是因为跟inno setup的版本有关系
Unicode版本不行换成Ansi版就可以了
离线yiyeshu2012

发帖
17
金钱
170
威望
17
只看该作者 3 发表于: 2014-12-12
或者是在Unicode版本里把string显示声明为AnsiString
离线yiyeshu2012

发帖
17
金钱
170
威望
17
只看该作者 4 发表于: 2014-12-12

终于解决了
这酸爽啊

这段时间delphi语法都翻了一遍及涉及到服务api的各类帖子。。。