2010-03-21 21 views
5

Tôi tương đối mới với WiX. Đó là một công cụ tuyệt vời, nhưng tôi vẫn cần một số thời gian để tìm hiểu nó tốt hơn. Tôi đã gặp sự cố khi đăng ký và hủy đăng ký thành phần COM . Tôi đã tạo trình cài đặt cho hai ứng dụng, cho phép gọi chúng là A và B. Cả hai đều đang sử dụng cùng một thành phần COM. Tôi đã sử dụng công cụ nhiệt, như được khuyến nghị là . Khi cài đặt A hoặc B, thành phần được đăng ký mà không có bất kỳ vấn đề nào .Khắc phục: COM hủy đăng ký khi xóa một trong hai chương trình

Nhưng khi tôi cài đặt A và B, sau đó loại bỏ A (với chương trình Thêm/loại bỏ), lớp COM không được đăng ký và B không thể sử dụng nữa. Có giải pháp sạch để ngăn điều này xảy ra không? Tôi muốn hủy đăng ký COM khi BOTH A và B được gỡ cài đặt.

Bất kỳ trợ giúp sẽ được đánh giá cao,

Trân trọng, madbadger

EDIT: Cảm ơn cho câu trả lời của bạn. Tôi đặt GUID cho cùng một giá trị trong cả hai trình cài đặt và bây giờ các khóa registry đang được gỡ bỏ đúng cách, đó là khi chương trình cuối cùng được loại bỏ khỏi hệ thống.
Hovewer, vấn đề vẫn tồn tại vì một lý do. Tôi đã kiểm tra sổ đăng ký theo HKEY_CLASSES_ROOT/CLSID/[COM GUID phù hợp]. Đây là những gì xảy ra:
- Tôi cài đặt A và đường dẫn đến COM được đặt thành [đường dẫn đến A/component.dll]
- Tôi cài đặt B và đường dẫn đến COM được đặt thành [đường dẫn đến B/component.dll ]
- Tôi xóa B và đường dẫn đến COM vẫn còn [đường dẫn đến B/component.dll]
- Hiện tại A không thể truy cập thành phần COM được đăng ký, vì [đường dẫn đến B/component.dll] không tồn tại nữa

Bây giờ tôi giả định rằng bắt buộc phải đặt thành phần COM trong cùng thư mục cho cả hai ứng dụng. Trình cài đặt Windows có thể không hoàn nguyên về đường dẫn cũ hay là thiếu thứ gì đó không?

Trả lời

4

Các cửa sổ cài đặt sẽ làm việc này cho bạn, nhưng chỉ nếu thành phần COM của bạn đã GUID tương tự trên cả A và B, (và của dll được cài đặt trong cùng một vị trí của cả hai ứng dụng.)

Trình cài đặt Windows hoạt động bằng cách tính tham chiếu từng thành phần (trên toàn bộ hệ thống). Các thành phần được xác định bởi GUID của họ.

Nếu các thành phần COM có cùng GUID, những gì xảy ra là thế này:

  • Install A: refcount Component đi từ 0-> 1, cửa sổ cài đặt đăng ký nó
  • Install B: refcount Component đi từ 1-> 2, không có gì xảy ra
  • Uninstall A: refcount Component đi từ 2-> 1, không có gì xảy ra
  • Uninstall B: refcount Component đi từ 1-> 0, cửa sổ cài đặt sẽ hủy đăng ký nó

Nếu nó không có cùng một GUID, những gì xảy ra là này

  • Install A: Hợp phần A refcount đi từ 0-> 1, cửa sổ cài đặt đăng ký nó
  • Install B: Hợp phần B refcount đi từ 0-> 1, cửa sổ trình cài đặt đăng ký nó, ghi đè mục đăng ký từ thành phần A.
  • Gỡ cài đặt A: Thành phần Một lần truy cập từ 1-> 0, trình cài đặt cửa sổ sẽ hủy đăng ký, xóa mục đăng ký.
    - Có vẻ như đây là tình huống bạn đang ở trong số
  • Gỡ cài đặt B: Thành phần B truy cập từ 1-> 0, trình cài đặt windows hủy đăng ký, xóa mục đăng ký (nhưng chúng đã bị xóa)

chỉnh sửa nâng lên từ nhận xét:

cũng như các GUID, mỗi thành phần cũng có một "con đường chính". Nếu thành phần chứa một hoặc nhiều tệp, bạn nên đặt tệp nào là tệp "Key" bằng cách sử dụng KeyPath="foo.dll". Nếu thành phần chứa một hoặc nhiều mục đăng ký, nó tương tự.

Khi kiểm tra xem có cài đặt gì không, trình cài đặt cửa sổ sẽ kiểm tra GUID, đọc đường dẫn chính, sau đó kiểm tra tệp ở đường dẫn chính (đây là cách tính toán mọi thứ trong phiên bản) nếu 2 thành phần có cùng GUID, thì phải cũng có cùng một đường dẫn chính, trong đó phải giải quyết cho cùng một vị trí trong hệ thống tệp khi sản phẩm được cài đặt.

Đây là một cách để nói cả hai trình cài đặt phải đặt các tệp được chia sẻ ở cùng một nơi. Đối với nơi để đặt chúng, System32 KHÔNG phải là một nơi tốt.

Tôi muốn đề xuất một nơi nào đó trong thư mục tệp chung (thường là Program Files\Common Files\YourCompanyName). Bạn sẽ nhập mã này vào Wix như sau: Directory="[CommonFilesFolder]\YourCompanyName"

+0

Tôi có nên đặt thành phần COM ở một vị trí cho cả hai trình cài đặt không? Thư mục system32 có phải là nơi tốt cho nó không? – madbadger

+0

Vâng, bạn phải đặt nó ở cùng một vị trí.(Trình cài đặt cửa sổ xác định với cả GUID và đường dẫn tệp/đăng ký). System32 KHÔNG phải là một nơi tốt. Tôi muốn đề nghị một nơi nào đó dưới thư mục tập tin phổ biến (thường là 'Program Files \ Common Files \ YourCompanyName'). Bạn sẽ nhập vào Wix như sau: 'Directory =" [CommonFilesFolder] \ YourCompanyName "' –

+0

Cảm ơn rất nhiều vì đã giải thích điều này rất tốt! – madbadger

1

Trong thẻ Thành phần, bạn có đang sử dụng cùng một Hướng dẫn trong mỗi trình cài đặt không?

0

Bạn nên bao bọc thành phần phổ biến này trong mô-đun hợp nhất và tham chiếu nó từ cả hai ứng dụng của bạn.

Điều này sẽ tự động cho phép các tệp dll được chia sẻ thực hiện công việc của mình khi gỡ cài đặt.

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