2009-11-20 32 views
9

Chúng tôi sử dụng tệp kê khai để thực hiện đăng ký COM miễn phí, như tôi cũng đã mô tả chi tiết trong this other question.Cách đăng ký COM miễn phí trong kiến ​​trúc trình cắm thêm

Bây giờ chúng tôi đang cố gắng sử dụng COM không đăng ký với ứng dụng hỗ trợ trình cắm. Các trình cắm thêm là các tệp OCX có thể được thêm vào thư mục của ứng dụng chính sau khi ứng dụng chính đã được cài đặt.

Tuy nhiên, điều đó có nghĩa là tệp kê khai của ứng dụng chính cần phải được trình cài đặt trình cắm thêm vá. Điều đó có vẻ giống như một điều nguy hiểm và dễ bị lỗi, đặc biệt nếu nhiều trình cắm thêm có thể được cài đặt.

Có cách nào để chia nhỏ tệp kê khai của ứng dụng chính để mỗi trình cắm thêm có thể thêm phần riêng của nó dưới dạng tệp riêng biệt không? Hoặc một cách an toàn khác để vá tệp kê khai?

Trong trường hợp có liên quan: chúng tôi tạo trình cài đặt của chúng tôi với wix.

Trả lời

6

Tôi sẽ không khuyên bạn sửa đổi tệp kê khai của ứng dụng; điều đó có vẻ khá mong manh và sẽ chỉ hoạt động nếu nó sống ở một vị trí có thể ghi.

Khi khởi động quá trình, tệp kê khai của ứng dụng được sử dụng để tạo "ngữ cảnh kích hoạt" được đẩy làm bối cảnh kích hoạt toàn bộ quy trình. Nhưng mỗi luồng cũng có một ngăn xếp bối cảnh kích hoạt, có thể được điều khiển trực tiếp. Các thao tác trên một luồng đã cho xem cả hai ở ngữ cảnh trên cùng trên ngăn xếp và bối cảnh kích hoạt toàn bộ quy trình khi tìm kiếm dữ liệu đăng ký COM.

Đề xuất là bất kỳ mã plugin nào cần phải gọi vào COM, tệp kê khai plugin cụ thể sẽ được kích hoạt trên chuỗi. Điều này có thể dễ dàng hầu hết được thực hiện theo một trong hai cách sau:

  1. Nhúng manifest plugin cụ thể như một ID2 manifest vào các plugin và biên dịch với vĩ mô ISOLATION_AWARE_ENABLED xác định. Điều này về cơ bản kết thúc các API Windows phổ biến cần ngữ cảnh từ tệp kê khai để tự động kích hoạt và hủy kích hoạt ngữ cảnh kích hoạt thích hợp xung quanh cuộc gọi.

  2. Kích hoạt/hủy kích hoạt ngữ cảnh kích hoạt thích hợp trên chuỗi xung quanh tất cả các điểm nhập vào plugin. Điều này được thực hiện thông qua các activation context APIs. Điều này được thực hiện dễ dàng nhất với một kích hoạt context management object.

+0

+1 Thú vị! Hình như tôi có một số đọc để làm. –

+0

Cảm ơn bạn, Eugene. Bạn có biết bất kỳ mã mẫu nào sử dụng ít nhất một trong các giải pháp này không? Cảm ơn bạn. –

+1

Tôi thực sự có điều này để làm việc bằng cách làm theo hướng dẫn tại đây: http://www.mazecomputer.com/sxs/help/sxsapi3.htm Và cũng ví dụ mã từ vvvsample tại đây: http://msf.codeplex.com/nhưng tôi phải sao chép các dll COM vào thư mục tương tự như exe đó là những gì tôi đang cố gắng để tránh. Tôi hiện đang chuyển đường dẫn đầy đủ của tệp kê khai bên ngoài và đường dẫn đầy đủ của thư mục kiểm tra tới CActCtxHandle.Create() (ví dụ: "C: \ Rel \ MyCppTests.dll.manifest" và "C: \ Rel" tương ứng). COM dll cũng nằm trong "C: \ Rel" nhưng exe nằm trong một thư mục khác (ví dụ: "C: \ TestRunner"). Bất kỳ ý tưởng nào? –

4

Nếu bạn đang sử dụng .Net, bạn có thể sử dụng the code được hiển thị trong câu trả lời này để quản lý ngữ cảnh kích hoạt.

+0

Điều này làm việc tuyệt vời! Cảm ơn, Samuel! :) –

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