2009-08-11 31 views
5

Làm thế nào một ứng dụng máy tính để bàn có thể giao tiếp với một dịch vụ Windows trong Vista/Windows2008/Windows7? Ứng dụng cần gửi các chuỗi nhỏ đến dịch vụ và nhận lại các phản hồi chuỗi. Cả hai đều được viết bằng Delphi 2009. (Vui lòng cung cấp mã mẫu)Delphi 2009: Làm thế nào để giao tiếp giữa Windows và ứng dụng máy tính để bàn dưới Vista?

+0

Thật tuyệt vời! Tôi hỏi khá nhiều câu hỏi tương tự và tôi cũng khiêm tốn hơn, nhưng tôi chỉ có những lời chỉ trích thay vì trả lời ... ;-) – PSyLoCKe

Trả lời

6

Con đường để đi là named pipes, có thể bạn sẽ phải xem qua giao tiếp trên Integrity levels khác nhau.

This article khám phá cách thực hiện điều này trong vista. Mặc dù nó được viết bằng C++ nó chỉ là các cuộc gọi Windows API cơ bản, vì vậy nó phải dịch đủ nhanh để Delphi.

Nếu bạn muốn tìm kiếm thêm về chủ đề này, giao tiếp này được gọi là Inter Process Communication, nhưng cụm từ tìm kiếm tốt hơn là IPC.

+1

Điều này có đúng không? Tôi đã thực hiện một số cửa sổ dịch vụ hoạt động như cả máy chủ TCP và máy khách TCP. Họ có tất cả chạy tốt như "hệ thống địa phương". Tôi đã luôn luôn tin rằng hạn chế là về tài nguyên mạng (// máy/tài nguyên/...). –

+1

Xác nhận đầu tiên là hoàn toàn không có thật. Mọi dịch vụ Windows mà tôi từng viết đều là một daemon mạng của một số loại. Thời gian duy nhất nó cần quyền truy cập funky là một trong đó cần thiết để có thể hiển thị giao diện người dùng là tốt. –

+0

Có, tôi đã nhớ sai, không được phép tạo kết nối mạng với tài nguyên bên ngoài hoặc bạn phải chạy dưới dạng NetworkService. Tôi đã xóa xác nhận đầu tiên. Nhưng vẫn còn, ống được đặt tên là một cách tốt hơn để giao tiếp với dịch vụ của bạn (có vấn đề định vị bài viết tương thích vista về IPC) –

2

Tôi chưa thử, nhưng tôi nghĩ bạn có thể sử dụng các đường ống có tên.

3

Hãy xem các câu trả lời trong số Exchange Data between two apps across PC on LAN có nhiều câu hỏi tương tự hiện nay. Các kết nối cục bộ qua TCP là tiêu chuẩn. Như tôi đã nói trong phản ứng của tôi ở đó, các giải pháp sử dụng giao diện kiểu "Remote Procedure Call" làm việc tốt. Tôi sử dụng RemObjects SDK cho loại điều này, và nó làm cho nó dễ dàng mở rộng để kiểm soát trên mạng nếu bạn muốn sau này.

Cả hai điều này cho phép bạn tạo kết nối cho hầu hết mã của bạn là "trong suốt" và bạn chỉ cần gọi một giao diện gửi dữ liệu qua dây và nhận kết quả. Sau đó, bạn có thể lập trình cách bạn thường làm và quên chi tiết của các ổ cắm.

+1

Dịch vụ không phải có quyền đặc biệt để sử dụng mạng, ngay cả khi nó chỉ nghe ở địa phương? –

+0

@Rob, nó phụ thuộc vào tài khoản mà dịch vụ đang chạy. – Kevin

+0

Tôi không gặp sự cố khi sử dụng RemObjects bằng tài khoản hệ thống hoặc tài khoản người dùng. Vấn đề liên quan nhiều đến quyền người dùng miền hơn truy cập socket TCP/IP độc lập. – mj2008

5

Sử dụng Indy bạn có thể dễ dàng tạo kết nối TCP giữa các ứng dụng của bạn. Đặc biệt nếu bạn chỉ cần gửi tin nhắn chuỗi. Đối với khách hàng (trong trường hợp của bạn các ứng dụng desktop) nó về cơ bản

var 
    Client : TIdTCPClient; 
... 
Client.Host := 'localhost'; 
Client.Port := AnyFreePortNumber; 
Client.Connect; 
Client.IOHandler.Writeln (SomeString); 
Response := Client.Readln; 
... 
Client.Disconnect; 

cho máy chủ (sẽ là dịch vụ trong trường hợp của bạn)

var 
    Server : TIdTCPServer; 
    Binding : TIdSocketHandle; 
... 
Server.DefaultPort := SameFreePortNumberAsInClient; 
Binding := Server.Bindings.Add; 
Binding.IP := '127.0.0.1';  
Binding.Port := Server.DefaultPort; 
Server.OnConnect := HandleConnection; 
Server.OnDisconnect := HandleDisconnection; 
Server.OnExecute := HandleCommunication; 
Server.Active := True; 

Chỉ cần thực hiện các phương pháp HandleCommunication. Nó được gọi là bất cứ khi nào khách hàng quyết định gửi một cái gì đó. Ví dụ:

procedure MyClass.HandleCommunication (AContext : TIdContext); 
var 
    Request : String; 
begin 
    Request := AContext.Connection.IOHandler.Readln; 
    if (Request = Command1) then 
    HandleCommand1 
    else if (Request = Command2) then 
    HandleCommand2 
    ... 
end; 

IIRC một dịch vụ chỉ được phép có một giao diện người dùng đồ họa HOẶC có thể truy cập mạng, vì vậy đây có thể là một vấn đề nếu dịch vụ của bạn cần có một giao diện đồ họa (mà bạn nên tránh dù sao, thấy question này). Tôi không biết làm thế nào điều này được xử lý trong Windwos Vista và sau đó mặc dù.

3

Bạn phải thay đổi người dùng dịch vụ từ hệ thống địa phương thành dịch vụ mạng và sau đó dịch vụ có thể sử dụng TCPIP. Tôi có một số dịch vụ sử dụng TCPIP cho một móc điều khiển bên ngoài. Chỉ cần đảm bảo cổng dịch vụ của bạn được cấu hình để bạn có thể xử lý mọi va chạm.

Một vài giao diện điều khiển của tôi dựa trên các trang XML được phân phát từ máy chủ HTTP nội bộ. Điều này cho phép tôi kiểm tra trạng thái của dịch vụ từ xa bằng bất kỳ trình duyệt web nào có thể truy cập cổng trên máy đó. Lợi thế của việc sử dụng HTTP trên các phương thức khác là nó hoạt động tốt khi bạn cần làm việc trên phần cứng mạng hiện có.

Nếu CHỈ của bạn sẽ giao tiếp cục bộ, sau đó đặt tên theo đường ống, mail slots or a memory mapped file có thể là phương pháp tốt nhất.

+0

Bạn không cần sử dụng tài khoản NetworkService chỉ để sử dụng TCP. Nó hoạt động tốt với các tài khoản LocalSystem và LocalService. –

1

Tôi sử dụng trong các ứng dụng dịch vụ của mình một bộ thành phần, phần mềm miễn phí có mã nguồn được gọi là Simple IPC.

Tìm kiếm torry.net. Nó đã hoạt động rất tốt trong tất cả các ứng dụng dịch vụ của tôi khi giao tiếp với ứng dụng dành cho máy tính để bàn.

John

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