打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
用D11.3编译的服务DLL安装成功启动服务成功
unit installUnit1;

interface

uses
  SysUtils, Classes, winsvc, Windows;

   // 服务名称
var
  ServiceName: string = 'sefdwan';

function InstallService(): boolean; stdcall;

function UninstallService(): boolean; stdcall;
function StartServices(): Boolean; stdcall;

implementation

function GetDllPath: string;
var
  ModuleName: string;
begin
  SetLength(ModuleName, 255);
  //取得Dll自身路径
  GetModuleFileName(HInstance, PChar(ModuleName), Length(ModuleName));
  Result := PChar(ModuleName);
end;

function CreateRegeditStringValue(hRoot: HKEY; szSubKey: string; kType: DWORD; ValueName: string; Data: string): boolean;
var
  hKeys: HKEY;
  lRet: Integer;
  Disposition: Integer;
begin
  result := false;
    //打开注册表键,不存在则创建它
    //long lRet=RegCreateKeyExW(hRoot,szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS|KEY_WOW64_64KEY,NULL,&hKey,NULL);
  lRet := RegCreateKeyExW(hRoot, pchar(szSubKey), 0, nil, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, nil, hKeys, @Disposition);
  if (lRet <> ERROR_SUCCESS) then
    exit;

    //修改注册表键值,没有则创建它
  lRet := RegSetValueExW(hKeys, pchar(ValueName), 0, kType, PBYTE(Data), sizeof(char) * (length(Data) + 1));

  if (lRet <> ERROR_SUCCESS) then
    exit;

  RegCloseKey(hKeys);
  result := true;
end;

function CreateRegeditDwordValue(hRoot: HKEY; szSubKey: string; ValueName: string; Data: DWORD): boolean;
var
  hKeys: HKEY;
  lRet: Integer;
  dwSize: DWORD;
  Disposition: Integer;
begin
  result := false;
    //打开注册表键,不存在则创建它
    //long lRet=RegCreateKeyExW(hRoot,szSubKey,0,NULL,REG_OPTION_NON_VOLATILE,KEY_ALL_ACCESS|KEY_WOW64_64KEY,NULL,&hKey,NULL);
  lRet := RegCreateKeyExW(hRoot, pchar(szSubKey), 0, nil, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, nil, hKeys, @Disposition);
 //         RegCreateKeyEx(hRoot, PChar(RegStr+'\ShellFolder'), 0, nil,REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, nil, TempKey, @Disposition);
  if (lRet <> ERROR_SUCCESS) then
    exit;

  dwSize := sizeof(DWORD);

    //修改注册表键值,没有则创建它
  lRet := RegSetValueExW(hKeys, pchar(ValueName), 0, REG_DWORD, @Data, dwSize);
  //       RegSetValueEx(TempKey, PChar('Attributes'), 0, REG_DWORD, @Buffer,BufSize)
  if (lRet <> ERROR_SUCCESS) then
    exit;

  RegCloseKey(hKeys);
  result := true;
end;
{
function WaitForService(ServiceHandle: Longword; AStatus: Longword): Boolean;
var
  PendingStatus: Longword;
  ServiceStatus: _SERVICE_STATUS;
  Error: Integer;
begin
  Result := False;
  case AStatus of
    SERVICE_RUNNING: PendingStatus := SERVICE_START_PENDING;
    SERVICE_STOPPED: PendingStatus := SERVICE_STOP_PENDING;
  end;
  repeat
    if not ControlService(ServiceHandle, SERVICE_CONTROL_INTERROGATE, ServiceStatus) then
    begin
    end;
    if ServiceStatus.dwWin32ExitCode <> 0 then
      Break;
    Result := ServiceStatus.dwCurrentState = AStatus;
    if not Result and (ServiceStatus.dwCurrentState = PendingStatus) then
      Sleep(ServiceStatus.dwWaitHint)
    else
      Break;
  until Result;
end;

//启动服务
function StartServices(const SvrName: string): Boolean;
var
   a, b: SC_HANDLE;
   c: PChar;
begin
   try
      Result := False;

      a := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
//      test('StartServices:OpenSCManager' + SysErrorMessage(GetLastError()));
      if a <= 0 then
         Exit;

      b := OpenService(a, PChar(SvrName), SERVICE_ALL_ACCESS);
      WaitForService(b, SERVICE_RUNNING);
   //   test('StartServices:OpenService' + SysErrorMessage(GetLastError()));

      if b <= 0 then
         Exit;
      try
         Result := StartService(b, 0, c);
 //        test('StartServices:StartService' + SysErrorMessage(GetLastError()));
      finally
         CloseServiceHandle(b);
         CloseServiceHandle(a);
      end;
   except
   end;
end;
}
//开启服务

function StartServices(): Boolean;
var
  a, b: SC_HANDLE;
  c: PChar;
  SvrName, dllname: string;
begin
  Result := False;
  dllname := GetDllPath();
  SvrName := ExtractFileName(dllname);
  SvrName := ChangeFileExt(SvrName, '');
  ServiceName := SvrName;
  OutputDebugStr('[InstallService] Service Start.....' + dllname + '----' + SvrName);

  a := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
  if a <= 0 then
    Exit;
  b := OpenService(a, PChar(SvrName), SERVICE_ALL_ACCESS);
  if b <= 0 then
    Exit;
  try
    Result := StartService(b, 0, c);
    CloseServiceHandle(b);
    CloseServiceHandle(a);
    OutputDebugStr('[InstallService] Service Start OK');
  except
    CloseServiceHandle(b);
    CloseServiceHandle(a);
    Exit;
  end;
end;

//**********
// Method:    服务安装接口
// Author:    Janus
// DateTime:  [7/1/2016]
//**********

function InstallService(): boolean;
var
  hscm: SC_HANDLE;
  szErr, szBin, szRePath: string;
  schService: SC_HANDLE;
  szFilePath: array[0..MAX_PATH] of char;
  hDll: HMODULE;
  cname, dllname: string;
begin
  //  TRACE(_T("[InstallService] Service is Begin....\r\n"));
//    if assigned(F) then
//   Fse:=F;
  dllname := GetDllPath();
  cname := ExtractFileName(dllname);
  cname := ChangeFileExt(cname, '');
  ServiceName := cname;
  OutputDebugStr('[InstallService] Service is Begin.....' + dllname + '----' + cname);
  result := false;
  hscm := OpenSCManagerW(nil, nil, SC_MANAGER_ALL_ACCESS);

   // WCHAR szErr[MAX_PATH] = {0};
  szErr := '';
  if hscm = 0 then  // NULL)
  begin
       // wsprintf(szErr, _T("[InstallService] OpenSCManagerW Error:[%d]...\r\n"),  GetLastError());
      //  TRACE(szErr);
    OutputDebugStr('[InstallService] OpenSCManagerW Error: ...' + SysErrorMessage(GetLastError()));

    exit;
  end
  else
  begin
    OutputDebugStr('[InstallService] OpenSCManagerW Successful......');
    //    TRACE(_T("[InstallService] OpenSCManagerW Successful...\r\n"));
  end;

   // WCHAR szBin[MAX_PATH] = {0};
   // wcsncpy_s(szBin, _T("%SystemRoot%\\SysWOW64\\svchost.exe -k "), sizeof(szBin));     // 32位
    //wcsncpy_s(szBin, _T("%SystemRoot%\\System32\\svchost.exe -k "), sizeof(szBin));     // 64位
    //wcsncat_s(szBin, name, wcslen(name));
  // szBin := '%SystemRoot%\SysWOW64\svchost.exe -k ';
  szBin := '%SystemRoot%\System32\svchost.exe -k ';
  szBin := szBin + cname;
  schService := CreateServiceW(
    hscm,          // SCManager database
      pchar(cname),          // name of service
      pchar(cname),          // service name to display
      SERVICE_ALL_ACCESS,          // desired access
//      SERVICE_WIN32_SHARE_PROCESS or SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,    // service type
      SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS,    // service type
      SERVICE_AUTO_START,          // start type
      SERVICE_ERROR_NORMAL,          // error control type
      pchar(szBin),          // service's binary
      nil,          // no load ordering group
      nil,          // no tag identifier
      nil,          // no dependencies
      nil,          // LocalSystem account
      nil);          // no password

  if (schService = 0) then
  begin
       // wsprintf(szErr, _T("[InstallService] CreateService(%s) Error:[%d]...\r\n"), name, GetLastError());
       // TRACE(szErr);
    OutputDebugStr('[InstallService] CreateService(%s) Error: ...' + SysErrorMessage(GetLastError()));

    exit;
  end
  else
  begin
      //  wsprintf(szErr, _T("[InstallService] CreateService(%s) Successful...\r\n"), name);
       // TRACE(szErr);
    OutputDebugStr('[InstallService] CreateService...' + cname);
  end;

  CloseServiceHandle(schService);
  CloseServiceHandle(hscm);


    //服务名对应SYSTEM\\CurrentControlSet\\Services\\下面的
  CreateRegeditStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\SvcHost', REG_MULTI_SZ, cname, cname);

  //  WCHAR szRePath[MAX_PATH] = {0};
   // wsprintf(szRePath, _T("SYSTEM\\CurrentControlSet\\Services\\%s"), name);
  szRePath := 'SYSTEM\CurrentControlSet\Services\' + cname;
  CreateRegeditStringValue(HKEY_LOCAL_MACHINE, szRePath, REG_EXPAND_SZ, 'ImagePath', szBin);
  CreateRegeditStringValue(HKEY_LOCAL_MACHINE, szRePath, REG_SZ, 'DisplayName', cname);
  CreateRegeditStringValue(HKEY_LOCAL_MACHINE, szRePath, REG_SZ, 'Description', 'This is the service of fz');  //描述
  CreateRegeditStringValue(HKEY_LOCAL_MACHINE, szRePath, REG_SZ, 'ObjectName', 'LocalSystem');
  CreateRegeditDwordValue(HKEY_LOCAL_MACHINE, szRePath, 'ErrorControl', 1);
  CreateRegeditDwordValue(HKEY_LOCAL_MACHINE, szRePath, 'Start', 2);

    // 添加 Parameters svchost启动的服务动态库
   // WCHAR szFilePath[MAX_PATH] = {0};
  // hDll := GetModuleHandle(nil);         //取调用DLL的EXE路径
  // GetModuleFileName(HInstance, szFilePath, sizeof(szFilePath);  //取调用DLL的EXE路径
  if (GetModuleFileName(HInstance, szFilePath, sizeof(szFilePath)) = 0) then  ////取得Dll自身路径
  begin
       // wsprintf(szErr, _T("[InstallService] GetModuleFileName Error:[%d]...\r\n"), GetLastError());
       // TRACE(szErr);
       // return false;
    OutputDebugStr('[InstallService] GetModuleFileName Error: ...' + SysErrorMessage(GetLastError()));
    exit;
  end
  else
  begin
       // TRACE(_T("[InstallService] GetModuleFileName Successful...\r\n"));
    OutputDebugStr('[InstallService] GetModuleFileName Successful..');
  end;
  // changefileext(szFilePath,'.DLL');
   // wsprintf(szRePath, _T("SYSTEM\\CurrentControlSet\\Services\\%s\\Parameters"), name);
  szRePath := 'SYSTEM\CurrentControlSet\Services\' + cname + '\Parameters';
  CreateRegeditStringValue(HKEY_LOCAL_MACHINE, szRePath, REG_EXPAND_SZ, 'ServiceDll', dllname); // szFilePath);

   // TRACE(_T("[InstallService] Service Install Sucessfull....\r\n"));
  OutputDebugStr('[InstallService] Service Install Sucessfull...');

  CloseServiceHandle(schService);
  CloseServiceHandle(hscm);
//  StartServices();

  result := true;
end;

//**********
// Method:    服务卸载接口
// Author:    Janus
// DateTime:  [7/1/2016]
//**********
function UninstallService(): boolean;
var
  hSCM, hService: SC_HANDLE;
  ss: string;
  ServiceStatus: SERVICE_STATUS;
  buff: string;
  HKEYs: hKey;
  lRet: Integer;
  cname, dllname: string;
begin
  try
//    if assigned(F) then
//   Fse:=F;
    //WCHAR szErr[MAX_PATH];
    //卸载服务
    dllname := GetDllPath();
    cname := ExtractFileName(dllname);
    cname := ChangeFileExt(cname, '');
    ServiceName := cname;
    OutputDebugStr('[InstallService] Service is Begin.....' + dllname + '----' + cname);
    hSCM := OpenSCManagerW(nil, nil, SC_MANAGER_ALL_ACCESS);
    if (hSCM = 0) then
    begin
      //  wsprintf(szErr, _T("[UninstallService] OpenSCManagerW Error:[%d]...\r\n"), GetLastError());
        //TRACE(szErr);
        //return false;
      OutputDebugStr('[UninstallService] OpenSCManagerW Error: ...' + SysErrorMessage(GetLastError()));
      exit;
    end
    else
    begin
      //  TRACE(_T("[UninstallService] OpenSCManagerW Sucessfull...\r\n"));
      OutputDebugStr('[UninstallService] OpenSCManagerW Sucessfull...');
    end;

    hService := OpenServiceW(hSCM, pchar(cname), SERVICE_ALL_ACCESS); // SERVICE_STOP);// or DELETE);
    if (hService = 0) then
    begin
      CloseServiceHandle(hSCM);
       // wsprintf(szErr, _T("[UninstallService] OpenServiceW Error:[%d]...\r\n"), GetLastError());
       // TRACE(szErr);
      OutputDebugStr('[UninstallService] OpenServiceW Error:...' + SysErrorMessage(GetLastError()));
    end
    else
    begin
        //TRACE(_T("[UninstallService] OpenServiceW Sucessfull...\r\n"));
      OutputDebugStr('[UninstallService] OpenServiceW Sucessfull...');
    end;

    //停止服务
    ControlService(hService, SERVICE_CONTROL_STOP, ServiceStatus);
    DeleteService(hService);

    //释放服务
    CloseServiceHandle(hSCM);
    CloseServiceHandle(hService);

    //清除注册表配置项
  //  HKEY hKey;
    //long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Svchost"), 0, KEY_ALL_ACCESS|KEY_WOW64_64KEY, &hKey);     // 不重新指向32位注册表,即还在64位注
    lRet := RegOpenKeyEx(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost', 0, KEY_ALL_ACCESS, HKEYs);          // 会重新指向32位的节点下
    if (lRet = ERROR_SUCCESS) then
    begin
        //TRACE("[UninstallService] RegOpenKeyEx Successful...\r\n");
      OutputDebugStr('[UninstallService] RegOpenKeyEx Successful...');
      lRet := RegDeleteValue(HKEYs, PChar(cname));
      RegCloseKey(HKEYs);
    end;

   // WCHAR buff[MAX_PATH];
  //  wcsncpy_s(buff, _T("SYSTEM\\CurrentControlSet\\Services\\"), sizeof buff);
  //  wcsncat_s(buff, name, 100);
    buff := 'SYSTEM\CurrentControlSet\Services\' + cname;
    RegDeleteKey(HKEY_LOCAL_MACHINE, pchar(buff));

  //  TRACE("[UninstallService] UnInstall SvcHostDllSrv Successful...\r\n");
    OutputDebugStr('[UninstallService] UnInstall SvcHostDllSrv Successful.....');
    result := true;
  except
    OutputDebugStr('[UninstallService] UnInstall Error.....');
  end;
end;

end.
----------------------------------------------
永远是DELPHI初学者。            
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
ActiveX启动下载者(delphi)
delphi 启动、停止服务函数
Delphi把程序注册为服务
检测远程文件存在
Moodle应用: Windows环境下的完整安装包
Windows下在同一台机器上安装多个Tomcat服务
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服