2013-08-19 1 views
0

역사에서어떻게 런타임에 내 Windows 서비스를 시작하거나 OnAfterInstall

나는 업데이트 및 서버 기능을 처리하기 위해 내 Platform Application의 일환으로 Windows Service를 구축하고, 그래서 경우 다른 컴퓨터에 설치할 수 있습니다 Client Application이 설치되어 있습니다. UDP를 사용하여 브로드 캐스트 메시지를주고받으며, TCP는보다 민감하고 중요한 메시지를 처리합니다.

내 응용 프로그램을 쉽게 바로 컴퓨터에 실행 파일을 복사하고이를 실행하는 경우로, 최종 사용자에 의해 설치 될 수 있음을 원하는 목적

. 주 응용 프로그램은 사용자가 관리자인지 확인하고, 구성 파일을 만든 다음 Windows 서비스를 설치하고 실행하여 관리자가 아닌 사용자가 로그인하면 관리 권한과 관련하여 응용 프로그램에서 오류를받지 않습니다. 목표는 현재 기술자가 필요없는 대부분의 구성을 만드는 것입니다. 데이터베이스가 원격 일 것이기 때문입니다.

문제

내 서비스는 명령 MyService.exe /install 정상적으로 설치되는하지만이 자동으로 시작되지 않습니다. 시작하는 유일한 방법은 Control Panel > Admin Tools > Services에 가서 수동으로 수행하는 것입니다. 내 응용 프로그램을 통해 net start MyService에 전화를 걸려고했지만 셸에서 invalid service name을 받았습니다. executable name, display nameobject name 서비스를 시도했지만 그 중 아무 것도 작동하지 않았습니다.

object ServiceMainController: TServiceMainController 
    OldCreateOrder = False 
    OnCreate = ServiceCreate 
    DisplayName = 'PlatformUpdateService' 
    Interactive = True 
    AfterInstall = ServiceAfterInstall 
    AfterUninstall = ServiceAfterUninstall 
    OnShutdown = ServiceShutdown 
    OnStart = ServiceStart 
    OnStop = ServiceStop 
    Height = 210 
    Width = 320 

질문

I 코드가 아닌 사용자의 손에 의해 내 서비스를 시작하려면 어떻게해야하나요 : 이것은 내 또한 TService의 대상인가? 호출 이후에 클라이언트 응용 프로그램 내에서 또는 클라이언트 자체에서 수행 할 수 있다면 가장 좋습니다.

+0

'net start'을 사용하는 경우 서비스 모듈의'Name' 속성에 넣는 고유 한 이름을 제공해야합니다.이 이름은 기본적으로 'Service1'입니다. –

+0

PS - 설치 후 이벤트로 시작하지 않을 것을 적극 권장합니다. 어떤 앱을 설치하든 시작하는 앱과 동일해야합니다. InnoSetup을 보았습니까? –

+0

제가 살펴 보겠습니다. 당신이 말한 것처럼이 서비스를 시작할 수도 있습니다. – PSyLoCKe

답변

6

여기 AfterInstall 경우에, 샘플 StartService 전화입니다 :

procedure TServiceMainController.ServiceAfterInstall(Sender: TService); 
var 
    Manager, Service: SC_HANDLE; 
begin 
    Manager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS); 
    Win32Check(Manager <> 0); 
    try 
    Service := OpenService(Manager, PChar(Name), SERVICE_ALL_ACCESS); 
    Win32Check(Service <> 0); 
    try 
     Win32Check(StartService(Service, 0, PChar(nil^))); 
    finally 
     CloseServiceHandle(Service); 
    end; 
    finally 
    CloseServiceHandle(Manager); 
    end; 
end; 

그러나 나는 일반적으로 너무 net start에 성공을해야대로, 당신을 위해 작동 모르겠어요.

+0

+1하지만 부울 주조는별로 신경 쓰지 않습니다. Win32Check (Manager <> 0)의 문제점은 무엇입니까? –

+0

@David - 고마워! 부울 주조는 비교와 달리 코드를 생성하지 않습니다. 그러나 내가 그것을 선호하는 이유는 그것이 나에게 자연스럽게 보입니다. .. 비록 큰 일이 아니야. –

+0

구현 세부 정보에 의존하는 것은 나에게 자연스러운 것이 아니라 각각 자신에게 달려있다. –

관련 문제