2012-04-19 21 views
7

Tôi có CustomAction sau đây trong dự án của tôi: Chương trìnhLàm cách nào để nhận mã trả về từ CustomAction?

<CustomAction Id="InstallDriver" 
        Return="check" 
        Execute="deferred" 
        Impersonate="no" 
        FileKey="FileDriverInst" 
        ExeCommand="-install" /> 

<InstallExecuteSequence> 
    <Custom Action="InstallDriver" Before="InstallServices" /> 
</InstallExecuteSequence> 

rằng cài đặt trình điều khiển sản xuất mã trở lại hữu ích, ví dụ nếu quá trình cài đặt thất bại vì hệ thống cần phải được khởi động lại sau một gỡ bỏ cài đặt trình điều khiển trước.

Hiện tại nếu bất kỳ điều gì khác ngoài thành công được trả về, tôi nhận được hộp thoại thông báo 'Chương trình chạy như một phần của quá trình thiết lập không hoàn thành như mong đợi.' và cài đặt không thành công. Đây không phải là tối ưu.

Tôi làm cách nào để nhận và xử lý mã trả lại?

+0

thiết kế của bạn không phải là tối ưu. Quá trình cài đặt Windows không được khai báo. Có các mẫu tốt hơn để cài đặt trình điều khiển. –

+1

@ChristopherPainter Trình cài đặt dựa trên Wix cho gói này phải sử dụng các công cụ tương tự như các cơ chế cài đặt khác của chúng tôi, tôi sợ rằng tôi không có tiếng nói. – fredley

+1

Sau đó, tôi không thể làm gì cho bạn. Đó đơn giản là cách MSI xử lý các cuộc gọi EXE. Bạn sẽ phải viết các hành động tùy chỉnh của riêng bạn để bọc cuộc gọi EXE và sau đó giải thích lý do thất bại. Với tôi điều này chỉ thêm một điểm thất bại khác. –

Trả lời

3

Trình cài đặt Windows không hỗ trợ xử lý các giá trị trả về hành động tùy chỉnh.

Đối với tác vụ tùy chỉnh EXE, giá trị trả về khác không được hiểu là lỗi và quá trình cài đặt sẽ dừng. Chỉ có một win32 DLL hoặc VBScript hành động tùy chỉnh có thể thay đổi hành vi cài đặt thông qua return code của nó, nhưng nó vẫn còn rất hạn chế.

Nếu bạn muốn khởi động lại máy sau khi cài đặt, bạn có thể đặt thuộc tính REBOOT.

3

Đã thêm làm "câu trả lời" theo yêu cầu:

Toàn bộ thiết kế của bạn không tối ưu. Quá trình cài đặt Windows không được khai báo. Có các mẫu tốt hơn để cài đặt trình điều khiển.

Đó đơn giản là cách MSI xử lý các cuộc gọi EXE. Bạn sẽ phải viết các hành động tùy chỉnh của riêng bạn để bọc cuộc gọi EXE và sau đó giải thích lý do thất bại. Với tôi điều này chỉ thêm một điểm thất bại khác.

1

Bạn không thể lấy mã trả về từ CustomAction, nhưng trong một vòng về cách bạn có thể đặt mã trả về sẽ là gì trên thuộc tính. Điều đó cũng có thể giống như nhận mã trả lại.

Bạn phải tải nó trong tập lệnh/dll hành động tùy chỉnh của bạn đang hoạt động. Nếu không, mã trả lại chỉ hiển thị trong nhật ký.

Ví dụ, nếu bạn có tài sản như

<Property="MyCode" Secure="yes"> 

Sau đó, trong VBScript (hoặc JScript), bạn có thể nhận được giá trị của tài sản đó như thế này:

VBScript

Session.Property("MyCode") 

Ban đầu, nó là null. Bạn có thể đặt nó trong VBScript như thế này:

If someCondition = 4 Then 
    Session.Property("MyCode") = "4" // For a return code of 4 
End If 

Sau khi trở lại trong tập tin WiX .wxs của bạn, nếu bạn nhìn vào giá trị tài sản của bạn, nó bây giờ 4. là bạn thậm chí có thể sử dụng nó trong các thẻ CDATA.

Ví dụ, chỉ đẻ trứng một hộp thoại nếu MyCode bằng toàn bộ 4.

<Publish Dialog="SpawnDialog" ...><![CDATA[ MyCode = 4 ]]></Publish>