一个取服务PID的C语言!/////////////////////////////////////////////////////////
// Get PID of Service Process
// hScMgt 为OpenSCManager()的返回值
// lpSrvName是服务名
DWORD GetServicePid(SC_HANDLE hScMgt, LPCTSTR lpSrvName)
{
     SC_HANDLE                 hSrv;
     SERVICE_STATUS_PROCESS     InfoLevel;
     DWORD                     dwBytesNeed;     hSrv = OpenService(hScMgt, lpSrvName, SERVICE_QUERY_STATUS);
    if (hSrv == NULL)
     {
         printf("[-] OpenService() Error: %d\n", GetLastError());
        return 0;
     }
    if(!QueryServiceStatusEx(hSrv, SC_STATUS_PROCESS_INFO, (LPBYTE) &InfoLevel, sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeed))
     {
         printf("[-] QueryServiceStatusEx() Error: %d\n", GetLastError());
         CloseServiceHandle(hSrv);
        return 0;
     }
     CloseServiceHandle(hSrv);
    return     InfoLevel.dwProcessId;
}

解决方案 »

  1.   

    他那个函数写得不好用,我稍微改了,参数为服务名function GetServicePid(lpSrvName: string): DWORD;
    var
      hScMgt, hSrv: SC_HANDLE;
      InfoLevel: SERVICE_STATUS_PROCESS;
      dwBytesNeed: DWORD;
    begin
      Result := 0;
      hScMgt := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
      if (hSrv = 0) then
      begin
        ShowMessage(Format('[-] OpenSCManager() Error: %d', [GetLastError()]));
        Exit;
      end;  hSrv := OpenService(hScMgt, PChar(lpSrvName), SERVICE_QUERY_STATUS);
      if (hSrv = 0) then
      begin
        ShowMessage(Format('[-] OpenService() Error: %d', [GetLastError()]));
        Result := 0;
      end;  if not (QueryServiceStatusEx(hSrv, SC_STATUS_PROCESS_INFO, PBYTE(@InfoLevel),
        sizeof(SERVICE_STATUS_PROCESS), dwBytesNeed)) then
      begin
        CloseServiceHandle(hSrv);
        Exit;
      end;
      CloseServiceHandle(hScMgt);
      CloseServiceHandle(hSrv);
      Result := InfoLevel.dwProcessId;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      ShowMessage(IntToStr(GetServicePid('stisvc')));
    end;
      

  2.   

    hSrv := OpenService(hScMgt, PChar(lpSrvName), SERVICE_QUERY_STATUS);
      if (hSrv = 0) then
      begin
        ShowMessage(Format('[-] OpenService() Error: %d', [GetLastError()]));
        Exit;
      end;
      

  3.   

    完整DEMO下载地址
    http://dl6.csdn.net/fd.php?i=148320204409465&s=d462ae5dd6affb2b260b2013428e980f
    上边代码需修改后的WinSvc 单元才可运行,WinSvc在DEMO里附带里
      

  4.   

    很好,很强大~
    http://topic.csdn.net/u/20100122/21/b1e45a70-91b9-4365-b3db-f84d6a9ab739.html
    sanguomi能帮我看下这个问题吗