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?
Trả lời
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.
Đ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/...). –
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. –
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) –
Tôi chưa thử, nhưng tôi nghĩ bạn có thể sử dụng các đường ống có tên.
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.
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? –
@Rob, nó phụ thuộc vào tài khoản mà dịch vụ đang chạy. – Kevin
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
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ù.
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.
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. –
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
- 1. Giao tiếp giữa ứng dụng Windows Store và ứng dụng máy tính để bàn gốc
- 2. Giao tiếp giữa dịch vụ cửa sổ và ứng dụng dành cho máy tính để bàn
- 3. Giao tiếp giữa SERVICE và ứng dụng web/máy tính để bàn
- 4. Sự khác biệt giữa ứng dụng dành cho máy tính để bàn và ứng dụng không phải máy tính để bàn trong cửa sổ
- 5. Ứng dụng Máy tính để bàn Python với Trình duyệt dưới dạng giao diện?
- 6. Ứng dụng Delphi 2009 sử dụng các biểu tượng lớn cho Vista
- 7. Làm thế nào để triển khai một ứng dụng máy tính để bàn Python?
- 8. Ứng dụng Máy tính để bàn Python
- 9. Lưu tệp vào máy tính để bàn trong Vista/Windows 7 trong .NET 2.0
- 10. Mở và đóng tab bàn phím cảm ứng của Windows 8 dưới màn hình máy tính
- 11. Interprocess Giao tiếp giữa ứng dụng C++ và Ứng dụng Java trong môi trường Windows OS
- 12. MVC và Swing trong ứng dụng máy tính để bàn
- 13. làm thế nào để cài đặt nativeXML bằng Delphi 2009?
- 14. C# Ứng dụng dành cho máy tính để bàn?
- 15. Làm cách nào để tạo ứng dụng máy tính để bàn di động python?
- 16. Ứng dụng trình duyệt WPF và các ứng dụng máy tính để bàn WPF
- 17. Delphi XE4: máy tính để bàn Linux mục tiêu? (ứng dụng gui)
- 18. Giao tiếp giữa các ứng dụng?
- 19. Soạn thảo dự án django dưới dạng ứng dụng dành cho máy tính để bàn
- 20. Các ứng dụng máy tính để bàn PHP
- 21. sự khác biệt giữa ứng dụng máy tính để bàn java và javafx là gì?
- 22. Chuyển ứng dụng Delphi 2006 sang Delphi 2009
- 23. Ứng dụng máy tính để bàn Java trên da?
- 24. Mua ứng dụng cho máy tính để bàn
- 25. Làm cách nào để giao tiếp giữa C++ và PHP trên Windows?
- 26. Python trong Phát triển ứng dụng máy tính để bàn
- 27. QtWebkit là giao diện ứng dụng dành cho máy tính để bàn
- 28. Apache Felix cho ứng dụng máy tính để bàn
- 29. Delphi 7 vista/windows 7 manifest
- 30. Làm thế nào để giữ một ứng dụng VB6 cũ chạy trong Windows Vista và Windows 7?
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