2010-03-23 39 views
6

Tôi đang viết một số loại chức năng IPC và cần chuyển một số tài nguyên nhất định từ quy trình này sang quy trình khác. Điều này làm việc tốt cho ống xử lý vv mà có thể được nhân đôi thông qua DuplicateHandle. Bây giờ tôi cần phải vượt qua một HDC từ một quá trình khác. Điều này thậm chí có thể? Nếu có: làm thế nào?Chia sẻ HDC giữa các quy trình khác nhau

Câu hỏi phụ: Tôi giả định xử lý cửa sổ chuyển tiếp (HWND) từ quy trình này sang quy trình khác là an toàn. Giả định này có đúng không?

Trả lời

6

Tất cả các xử lý GDI được lưu trữ trong bảng được ánh xạ vào mọi quá trình. Các mục trong bảng chứa id tiến trình của quá trình sở hữu, và điều này được kiểm tra trên mọi truy cập GDI vào tay cầm.

Vì vậy, (trớ trêu thay), xử lý GDI - bao gồm HDC - là hệ thống hợp lệ. Nhưng chỉ có thể được sử dụng từ quá trình tạo ra chúng.


This Page ghi lại mối quan hệ quá trình của các đối tượng GDI. Tất nhiên, như một điểm truy cập đáng chú ý là một số chức năng COM, và các thông báo cửa sổ như WM_PRINT không có bất kỳ hạn chế interprocess nào và chúng được truyền qua HDC, vì vậy chúng rõ ràng phải làm điều gì đó đằng sau hậu trường để sắp xếp HDC từ một quá trình tiếp theo.

+0

Tôi nghĩ rằng bạn và nobugz đều thích hợp với việc nhấn mạnh rằng vấn đề của tôi có thể được xem như là chia sẻ tài nguyên GDI nói chung. Tôi tìm thấy một bài viết liên quan ở đây: http://stackoverflow.com/questions/133948/sharing-gdi-handles-between-processes-in-windows-ce-6-0 Có ai đó muốn chia sẻ HFONTs. Có lẽ đây là giải đấu giống như HDC. Nhưng nếu có bảng này ánh xạ vào mọi quá trình thì tôi muốn có một hàm DuplicateGDIHandleFromThisTableForTheCurrentProcess đơn giản ... –

+2

Thực tế là bảng tồn tại trong tất cả các quá trình là một tạo phẩm của việc thực hiện GDI hiện tại, không phải là một tính năng thiết kế. Nó có thể biến mất. Và rất nhiều trường hợp các đối tượng GDI có con trỏ để sử dụng các cấu trúc dữ liệu để cho dù, xử lý là hợp lệ trên toàn hệ thống, đối tượng GDI thực sự chỉ có thể truy cập thành công trong một tiến trình. –

+0

Ok vì vậy những gì chắc chắn sẽ không hoạt động là sử dụng cùng một xử lý mà không cần thêm marshalling vào quá trình khác. Điều này đặt câu hỏi liệu có một chức năng công khai có sẵn để làm điều này không? –

8

HWND có thể được chia sẻ giữa các quá trình, SendMessage() sẽ không hoạt động nếu không. Tuy nhiên, chúng được đưa vào một máy tính để bàn cụ thể, một máy tính để bàn được kết hợp với một phiên. Có một phiên cho mỗi người dùng đã đăng nhập. Và phiên 0 là đặc biệt, phiên mà dịch vụ chạy. Và có một máy tính để bàn an toàn, một trong những bạn nhìn thấy lúc đăng nhập hoặc khi bạn nhấn Ctrl + Alt + Del, bạn không thể gây rối với hộp nhập mật khẩu. Nhưng miễn là cả hai quá trình chạy trong cùng một máy tính để bàn, bạn sẽ không gặp bất kỳ rắc rối nào.

HDC đang tối, không bao giờ thử điều đó. Tôi sẽ không giới thiệu nó. Bạn luôn có thể tạo một từ HWND bằng GetDC().

+0

SendMessage thực sự là một ví dụ tốt rằng nó phải làm việc giữa các quá trình (và các quá trình của tôi sẽ chạy trên cùng một màn hình trong cùng một phiên). Cảm ơn. Vì vậy, mối quan tâm chính của tôi vẫn là HDC. Bạn nói đúng, tôi có thể vượt qua HWND, nhưng điều đó có nghĩa là tôi sẽ phải cấu trúc lại mã mà tôi không muốn chạm vào. Tôi chỉ chờ một chút nữa thôi, có lẽ ai đó biết về một xác định có hoặc không ... –

+0

tại sao bạn không thử? Nếu bạn không phải tái cơ cấu mã thì bạn sẽ tìm ra đủ nhanh. –

+1

Mh bạn đã có một điểm ở đây. Nhưng ngay cả khi nó làm việc tôi cảm thấy tốt hơn để xây dựng trên hành vi tài liệu hơn là trùng hợp ngẫu nhiên mà có thể làm cho nó hoạt động trên máy tính của tôi nhưng phá vỡ những người khác (nó cũng phải làm việc trên XP, Vista và 7). Nhưng cố gắng chắc chắn sẽ không đau. Sau đó, ít nhất tôi có thể tìm hiểu rằng nó không hoạt động :) –

2

Giả sử rằng bạn muốn vẽ lên HDC thuộc một quy trình từ một quy trình khác (ví dụ: bằng cách sử dụng BitBlt), như được chỉ ra bởi nobugz và Chris Becke, bạn không thể chia sẻ HDC đó qua các ranh giới quy trình. Tuy nhiên, giả sử rằng HDC của một quá trình đó thuộc về một cửa sổ (và ý định của bạn cuối cùng là vẽ lên cửa sổ đó) thì bạn có thể truyền điều khiển cửa sổ đó cho tiến trình khác và trong quá trình này sử dụng GetDc để lấy HDC. Với HDC này, bạn có thể vẽ lên cửa sổ của quá trình khác.

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