2013-09-03 60 views
8

Tôi đã tạo một dịch vụ Windows với Delphi và sử dụng hai phương pháp để cài đặt, bắt đầu và dừng.Dịch vụ không bắt đầu

Phương pháp 1

nếu tôi cài đặt dịch vụ này sử dụng dòng lệnh

C:\MyService\ServiceApp.exe /Install 

nó cài đặt thành công và tôi có thể bắt đầu và ngừng quá trong dịch vụ giao diện điều khiển.

Phương pháp 2

nhưng nếu tôi cài đặt các dịch vụ tương tự với tên khác nhau sử dụng sc ví dụ

C:\Windows\system32>sc create myservice binpath= c:\MyService\ServiceApp.exe 

tôi thấy nó được cài đặt nhưng tôi không thể bắt đầu dịch vụ sử dụng dịch vụ giao diện điều khiển cũng như với

sc start myservice 

khi tôi truy vấn sử dụng SC, kết quả như sau

C:\Windows\system32>sc query myservice 

SERVICE_NAME: myservice 
     TYPE    : 10 WIN32_OWN_PROCESS 
     STATE    : 2 START_PENDING 
           (NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN) 
     WIN32_EXIT_CODE : 0 (0x0) 
     SERVICE_EXIT_CODE : 0 (0x0) 
     CHECKPOINT   : 0x0 
     WAIT_HINT   : 0x7d0 

cho đến bây giờ tôi đã sử dụng/Cài đặt nhưng tôi muốn cài đặt cùng một dịch vụ nhiều lần với các tên khác nhau, tôi có ý tưởng sử dụng từ bài đăng này. (How to install a windows service from command line specifying name and description?) ai cũng có thể giải thích sự khác biệt về hành vi giữa/Cài đặt và SC?

+0

Nếu bạn có thể hiển thị cho chúng tôi mã bạn đã cài đặt và cũng bắt đầu mã, chúng tôi có thể giúp bạn. –

+1

Để cài đặt: sc tạo myservice binpath = c: \ serviceapp \ ServiceApp.exe để bắt đầu: sc bắt đầu myservice hoặc đơn giản là bắt đầu từ bảng điều khiển dịch vụ – Girish

+0

Vui lòng chỉnh sửa câu hỏi của bạn để bao gồm thông tin quan trọng này, chứ không phải nhận xét. –

Trả lời

13

Bạn đã đụng độ với lỗi trong việc triển khai TService, xem QC#79781. Delphi không thể khởi động dịch vụ nếu tên dịch vụ nếu khác với TService.Name.

Tuy nhiên, bạn có thể tránh giới hạn này bằng cách điều chỉnh TService.Name trước khi bắt đầu dịch vụ. Một điểm tốt để làm điều này là sự kiện TService.OnCreate. Bạn cần phải biết tên thật của dịch vụ, vì vậy bạn cần phải chuyển nó như một đối số cho dịch vụ exe (thêm nó vào binpath của lệnh sc create).

Tạo dịch vụ:

sc create myservice1 binpath= "c:\MyService\ServiceApp.exe myservice1" 
sc create myservice2 binpath= "c:\MyService\ServiceApp.exe myservice2" 

Điều chỉnh tên:

procedure TMyService.ServiceCreate(Sender: TObject); 
begin 
    if (System.ParamCount >= 1) and not CharInSet(ParamStr(1)[1], SwitchChars) then 
    Name := ParamStr(1); 
end; 

Đây là một phương pháp khá thô sơ của phân tích lý luận, nhưng nó là ok làm ví dụ. Nếu đối số đầu tiên không bắt đầu bằng / hoặc -, nó giả định rằng đó là tên được cung cấp.

Ghi chú:

Một hạn chế của TService là nó không thể tạo ra các dịch vụ (sử dụng /install) với đối số trong dòng lệnh của họ, bởi vì nó sử dụng ParamStr(0) như binpath.

+1

Làm tốt lắm! Tôi đã cố gắng tìm ra lý do tại sao SC có thể bắt đầu dịch vụ khi được sử dụng với tên thật. –

+2

@Sertac: Dường như lỗi này là do hệ thống Delphi sử dụng để cho phép chia sẻ nhiều 'TService's' trong một exe. Tôi nghĩ rằng một giải pháp đơn giản sẽ là không kiểm tra 'Tên' khi chỉ có một TService. – JRL