2012-03-06 40 views
20

Tạo một dự án ATL trong MSVC dường như không chỉ tạo ra một mà là hai dự án; sau này được đặt tên giống như cũ nhưng với PS nối thêm vào tên của nó. Mục đích của dự án thứ hai này là gì và làm thế nào để tôi có thể biết tôi có cần nó không?

+2

"PS" là viết tắt của proxy/stub, có thể ai đó biết nhiều hơn ý nghĩa của nó! – ybungalobill

Trả lời

31

COM hỗ trợ việc tạo phương pháp giao diện gọi qua hai chủ đề khác nhau, hai quy trình khác nhau hoặc hai máy khác nhau. Điều này được gọi là marshaling. Hai chủ đề khác nhau là trường hợp phổ biến nhất, một máy chủ COM thường không phải là chủ đề an toàn. COM thực hiện an toàn luồng cho các trình thu thập đơn luồng như vậy bằng cách sửa đổi cuộc gọi từ chuỗi 'sai' thành luồng đã tạo máy chủ. Marshaling giữa các quá trình xảy ra khi bạn viết một máy chủ quá trình. Giữa các máy khác nhau trên mạng được gọi là DCOM.

Điều này được triển khai bằng cách tạo một phiên bản giao diện trông giống như chính xác như bản gốc. Nhưng tất cả các phương pháp của giao diện thực sự là những sản phẩm thay thế thực hiện công việc của marshaling cuộc gọi. Đây là proxy. Ở đầu kia của dây có một thay thế trông chính xác như giao diện nhưng thực hiện công việc ngược lại. Đây là cuống. Proxy và stub làm việc cùng nhau để tạo ra ảo tưởng rằng bạn đang thực hiện một cuộc gọi phương thức đơn giản trong chương trình của bạn.

Công việc chính của proxy là tuần tự hóa các đối số của cuộc gọi phương thức thành bộ nhớ đệm hoặc gói mạng. Điều này có thể khá khó khăn, đặc biệt là khi bạn sử dụng con trỏ đến các cấu trúc có kích thước thay đổi. COM cần giúp đỡ để có được quyền đó và đó là công việc của dự án FooPS của bạn. Khi bạn chạy midl.exe trên tệp .idl của bạn, hãy tự động tạo mã từ các định nghĩa giao diện để triển khai proxy và phần còn lại. Điều này là khá thường xuyên đủ tốt nhưng bạn có thể cần phải thực hiện của riêng bạn nếu các từ khóa được xây dựng trong midl là không đủ để mô tả dữ liệu của bạn.

Cuối cùng nhưng không kém phần quan trọng, Windows cung cấp một trình khắc phục chuẩn có thể sắp xếp các giao diện đơn giản. Được thiết kế để hỗ trợ tập hợp con của COM được định nghĩa bởi COM Automation. Nói cách khác, các giao diện bắt nguồn từ IDispatch và chỉ sử dụng các loại tương thích Tự động hóa. Bạn chỉ cần nhận được các mục đăng ký ngay để kích hoạt nó và không cần proxy/stub được tạo ra bởi midl. Và tất nhiên, nếu bạn chỉ thực hiện các cuộc gọi đơn giản trong quá trình trên một luồng thì bạn cũng sẽ không cần đến nó. Điều này khá phổ biến.

+4

câu trả lời tuyệt vời ... đã làm cho ngày của tôi :) – Houston

4

Mã proxy/sơ khai, có chứa các trình dữ liệu không chuẩn cho dữ liệu cần thiết để chuyển dữ liệu giữa các căn hộ khác nhau (luồng có liên quan). Nó được sử dụng khi ứng dụng gọi là đối tượng COM của bạn, sử dụng mô hình luồng luồng COM khác nhau. Có một tùy chọn trong thuật sĩ ATL/COM để hợp nhất mã này vào thư viện chính. Trong nhiều trường hợp phổ biến, bạn không phải lo lắng về nó (tức là khi dll COM của bạn chạy trong ngữ cảnh của máy khách), trừ khi bạn muốn viết một trình soạn thảo tùy chỉnh.

6

Như @ebutusov cho biết, * Dự án PS chứa triển khai cho Proxy and Stub. Chúng không phải là tiêu chuẩn, thay vào đó chúng được tạo ra bởi MIDL cho các giao diện được xuất từ ​​máy chủ ATL của bạn. Các giao diện này được khai báo trong tệp * .IDL. Các ouput của dự án là DLL. Bạn có thể đọc this article để biết thêm chi tiết.

Bạn có thể xóa dự án PS khỏi giải pháp trong trường hợp nếu bạn không xác định bất kỳ giao diện tùy chỉnh nào trong tệp * .IDL hoặc nếu bạn chỉ xác định các giao diện có công cụ sửa đổi kép và chỉnh sửa. Trong trường hợp đó, một marshaller typelib tiêu chuẩn sẽ được sử dụng.

Để có thể tận dụng các marshaller typelib tiêu chuẩn, người ta phải đăng ký một typelibrary (được thực hiện tự động kể từ khi bạn đang sử dụng ATL)

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