2008-12-26 34 views
6

Tôi có Dịch vụ Windows dựa trên Deplhi, khi cài đặt, phân tích một số đối số dòng lệnh. Tôi muốn các đối số đó được thêm vào dòng lệnh dịch vụ (giá trị ImagePath trên sổ đăng ký) để dịch vụ luôn được bắt đầu với chúng.Đối số dòng lệnh của Dịch vụ Windows Delphi

Tôi làm cách nào để thực hiện việc này?

Tôi muốn nhìn regedit như thế này:
tại registry key HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Services \ MyService

  • ImagePath = C:\Path\to\my\service.exe -some -arguments

Cảm ơn

Cập nhật: Quá trình cài đặt được thực hiện với >MyService.exe /install -some -arguments. Những đối số đó là những đối số tôi muốn tồn tại trong dòng lệnh.

Cập nhật: Tôi tìm thấy giải pháp bằng cách viết trực tiếp vào sổ đăng ký (xem here), nhưng tôi vẫn muốn một giải pháp thanh lịch hơn, như sử dụng một số thuộc tính TService hoặc thứ gì đó thuộc loại đó. Cảm ơn!

+0

Cài đặt được thực hiện như thế nào? –

Trả lời

8

Ok, sau một số nghiên cứu, tôi đã từ bỏ một cách tiếp cận thanh lịch và thực hiện đường dẫn thẳng về phía trước để ghi trực tiếp vào sổ đăng ký.

Để làm cho mọi việc đơn giản, tôi đã làm điều này: Tôi lưu trữ các đối số mà tôi muốn chuyển vào các biến trên TService của mình. Sau đó, tôi thiết lập sự kiện AfterInstall để viết trực tiếp vào sổ đăng ký (sử dụng một đối tượng TRegistry) dòng lệnh chính xác mà tôi muốn.

uses Registry; 
procedure MyService.AfterInstall(Sender: TObject) ; 
var 
    reg:TRegistry; 
begin 
    reg := TRegistry.Create; 
    try 
    reg.RootKey := 'HKEY_LOCAL_MACHINE'; 
    if reg.OpenKey('SYSTEM\CurrentControlSet\Services\MyService', True) then 
    begin 
     reg.WriteExtendString ('ImagePath', ParamStr(0) + ' -some -arguments') ; 
     reg.CloseKey; 
    end; 
    finally 
    reg.Free; 
    end; 
end; 

Không phải là giải pháp thanh lịch mà tôi đang tìm kiếm, nhưng nó thực hiện công việc.

Cảm ơn các câu trả lời khác!

0

Tôi không nghĩ rằng bạn có thể bắt đầu dịch vụ với họ, nhưng nếu bạn lưu trữ các thông số đó trong sổ đăng ký, bạn có thể sửa đổi chương trình để khởi động trong tương lai luôn luôn đi và lấy chúng. (ví dụ: nếu ParamCount = 0 sau đó truy lục thông số từ đăng ký)

+0

Bạn chắc chắn có thể bắt đầu dịch vụ với các thông số này. Câu hỏi đặt ra là làm thế nào để làm cho trình cài đặt thêm chúng vào sổ đăng ký. –

4

Đối số dịch vụ có thể được chuyển trong đối số lpBinaryPathName đến hàm CreateService. Trong TService của Delphi, nó được gọi bên trong TServiceApplication.RegisterServices.InstallService, mà bạn không thể ghi đè (dễ dàng).

Vì vậy, tôi nghi ngờ cách dễ nhất để thực hiện việc này là xử lý sự kiện TService.AfterInstall và tự cập nhật đăng ký qua ChangeServiceConfig.

0

Pablo, Tôi đã có cùng một câu hỏi và không thể tìm thấy bất cứ điều gì và cũng đã định tuyến chỉnh sửa đăng ký. Ngoài ra, tôi cũng sử dụng Tác vụ tùy chỉnh để tạo thư mục cài đặt bổ sung và sao chép tệp (trong C#). Đề xuất của bạn hữu ích và tôi cũng đã ngừng tìm kiếm một cách "thanh lịch". cảm ơn

2

Tôi vừa phát hiện ra một điều gì đó đáng ngạc nhiên, có thể đáng để chia sẻ.

Bạn có thể chỉ định các thông số cho các dịch vụ Windows trong (ít nhất) cách sau:

  1. Nhập nó trong Service Manager GUI là "Startparameter".
  2. Vượt qua nó như là đối số: sc.exe YourService param1 param2
  3. Nhập nó trong registry trong mục ImagePath = .. \ YourService.exe param1 param2

Trong Delphi có 2 cách để truy vấn application/thông số dịch vụ:

  • System.ParamCount/System.ParamStr: Bằng cách này bạn nhận được thông số của 3. ở trên.
  • TService.ParamCount/TService.Param []: Bằng cách này bạn nhận được các thông số của 1. và 2. ở trên.
+0

1. Sẽ chỉ hoạt động khi bạn khởi động dịch vụ từ trình quản lý dịch vụ, nó sẽ không được duy trì. –

+0

Đúng. Tôi đã triển khai thực hiện các thông số như mô tả trong câu trả lời được chấp nhận ở trên (AfterInstall). Câu trả lời này chỉ được dùng làm thông tin bổ sung. – nang

2

Bạn nên sử dụng API SCM để cài đặt đúng dịch vụ và định cấu hình nó. SC.EXE là giao diện dòng lệnh cho API SCM. Bạn không nên thao tác đăng ký trực tiếp trong tình huống này, nó hoạt động nhưng nó cũng phụ thuộc vào sự cho phép tài khoản dịch vụ có. Dù sao thì tôi tự hỏi tại sao bạn cần các đối số dòng lệnh nếu bạn nhúng chúng vào mã - thường những đối số đó được đặt bên ngoài dịch vụ (bởi trình cài đặt, trình cấu hình, bất kỳ điều gì) để thay đổi hành vi dịch vụ.

+0

Điểm tốt về sự cho phép, không có tính đến điều đó. Về nhu cầu của tôi, dịch vụ của tôi không có ứng dụng cấu hình và cài đặt được thực hiện với thông số/cài đặt (tôi đoán theo cách này, nếu tôi được phép tạo khóa reg cho dịch vụ, tôi cũng có quyền thủ công chỉnh sửa khóa). Có phải những thông số được cung cấp mà tôi muốn tồn tại không. Tôi không nhớ chính xác tại sao bây giờ, nhưng tôi nghĩ là vì tôi muốn dịch vụ chạy nhiều lần với các thông số khác nhau. –

+0

"nếu tôi có quyền tạo khóa reg". Có, vấn đề là có. Vista/7 có thể không cho phép trừ khi hoạt động được thực hiện với các đặc quyền nâng cao. Công tắc/cài đặt rất thuận tiện cho việc cài đặt dịch vụ nhanh chóng và dễ dàng, nhưng tốt hơn hết là nên cung cấp thủ tục cài đặt/gỡ cài đặt thích hợp cho người dùng. Tôi đã viết một kịch bản được sử dụng trong công cụ thiết lập InnoSetup miễn phí để xử lý các dịch vụ (http://www.sandon.it/?q=node/9), các dịch vụ hỗ trợ cài đặt khác nguyên bản. –

Các vấn đề liên quan