2012-04-08 10 views
5

Tôi sử dụng WM_COPYDATA để cho phép liên lạc giữa hai tiến trình A và B. Không có vấn đề gì khi trao đổi dữ liệu với các kiểu dữ liệu cơ bản.Truyền một Giao diện đến một quy trình khác

Bây giờ tôi gặp sự cố, trong một số trường hợp, tôi muốn chuyển Giao diện (IDispatch) từ quy trình A đến quy trình B. Có thể không?

+1

Không có trải nghiệm trực tiếp với WM_COPYDATA. Nhưng ave bạn đã kiểm tra điều này - http://www.codeproject.com/Articles/5307/Use-WM_COPYDATA-to-send-data-to-from-C-and-C-Windo. Ngoài ra Joseph Newcomer dường như đề nghị nó là có thể - http://www.flounder.com/wm_copydata.htm (và ông nói chung là đúng với tất cả mọi thứ Win32) – Gangadhar

+0

@Gangadhar Đây là một liên kết rất tốt đẹp. Vấn đề xuất phát từ thực tế là tất cả dữ liệu phải được tuần tự hóa vào bộ đệm WM_COPYDATA - bạn có thể thực hiện nó theo cách thủ công (như tác giả gợi ý), hoặc dựa vào marshaling tự động, như COM hoặc mORMot. –

+1

Có lẽ tôi hoàn toàn tắt, nhưng còn về [ObjectFromLresult] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd373605%28v=vs.85%29.aspx) và [LresultFromObject ] (http://msdn.microsoft.com/en-us/library/windows/desktop/dd318557%28v=vs.85%29.aspx)? – kobik

Trả lời

12

Không thể chuyển trực tiếp con trỏ giao diện sang một quy trình khác. Giống như bất kỳ con trỏ nào khác, một giao diện chỉ hợp lệ trong không gian địa chỉ tiến trình mà khởi tạo nó trong thời gian chạy. COM có cơ chế riêng của mình cho các giao diện marshaling và dữ liệu trên các ranh giới quy trình, thậm chí trên các căn hộ khác nhau trong cùng một quy trình. Trong trường hợp giao diện, có liên quan đến proxy và sơ khai chạy trong mỗi quy trình/căn hộ và giao tiếp với nhau bằng cách sử dụng các cơ chế IPC khác nhau, chẳng hạn như đường ống, RPC hoặc TCP/IP. Hãy nhìn vào những bài viết này cho cách sử dụng giao diện trên các quy trình/căn hộ được thực hiện:

Inter-Object Communication

Understanding Custom Marshaling Part 1

Để làm những gì bạn đang yêu cầu, mà không cần đến việc thực hiện marshaling tùy chỉnh, bạn sẽ phải làm cho một trong các quy trình hoạt động như máy chủ COM ngoài quy trình, và sau đó quy trình khác có thể sử dụng CoCreateInstance() hoặc GetActiveObject() để có được con trỏ giao diện đến đối tượng của máy chủ hoạt động trong không gian địa chỉ cục bộ của nó và để COM xử lý các chi tiết đầm lầy cho bạn.

8

Không thể thực hiện trực tiếp, nhưng bạn có thể sử dụng khung dịch vụ Máy khách-Máy chủ, có thể dựa trên giao diện.

Ví dụ: xem tính năng cuối cùng của mã nguồn mở mORMot framework: Interface based services sample codethis link của chúng tôi.

Bạn có thể thực hiện interface trên quy trình từ xa. Tính năng này xử lý tất cả các phương tiện liên lạc của khuôn khổ, tức là cuộc gọi trong quá trình, tin nhắn GDI, các đường ống có tên và TCP/HTTP. Bên trong nó sẽ sử dụng WM_COPYDATA cho các tin nhắn GDI, sau đó truyền các tham số và kết quả dưới dạng JSON. Sử dụng this link để tải xuống mã nguồn (sử dụng phiên bản http://synopse.info/fossil 1.16+) và tài liệu (có một số trang về cách triển khai các dịch vụ đó).

Đây là dự án nguồn mở, hoạt động với Delphi 6 lên đến XE2.

Bạn cũng có thể hiển thị giao diện của mình bằng SOAP hoặc DataSnap Client-Server (nếu bạn có phiên bản tương ứng của Delphi) hoặc gói thương mại n-Tier (như http://www.remobjects.com/da). Điều này tương tự như phương thức được thực hiện trong mORMot.

COM cũng là một ứng cử viên tốt, có nguồn gốc Windows, nhưng khó khởi tạo hơn: bạn sẽ phải đăng ký COM trên mỗi PC (với quyền quản trị viên) và bạn sẽ không thể thực hiện làm việc qua mạng (DCOM không được dùng nữa, hãy nhớ). COM là tốt nếu bạn muốn dịch vụ của bạn được chia sẻ với các ngôn ngữ khác, như .Net, nhưng chỉ ở địa phương.