2009-12-11 24 views
7

Mọi nhà phát triển Windows đều quá quen thuộc với một cảnh báo về biểu mẫu:Làm cách nào để tùy chỉnh "% s đã gặp phải sự cố và cần đóng"?

Foo.exe đã gặp sự cố và cần phải đóng.

Tôi đã từ chức cho các ứng dụng của mình khi phát ngẫu nhiên, nhưng khi thực hiện, tôi không muốn thấy "Foo.exe" tại đây. Tôi muốn thấy một cái tên "thân thiện" như "FooBrowser ™".

Tôi đã tìm kiếm tài liệu MSDN cao và thấp để biết cách ghi đè chuỗi này và không tìm thấy nó. Và tôi đã thực hiện rất nhiều thí nghiệm để xem liệu tôi có thể vấp phải cơ chế mà không có bất kỳ may mắn nào. Tuy nhiên, khi tôi tìm kiếm trên web cho "đã gặp sự cố và cần phải đóng", tôi thấy nhiều người thảo luận về các trường hợp trước một tên thân thiện và tôi nghi ngờ tất cả họ đều thay thế toàn bộ cảnh báo bằng chính họ. :-)

Tôi cần điều này để làm việc cho các ứng dụng Win32 gốc; .NET không phải là một lựa chọn. Tập hợp các ví dụ mà tôi thấy được thảo luận trên web bao gồm Microsoft Internet Explorer (một ứng dụng gốc) và Microsoft Works (mà tôi cho là vẫn là một ứng dụng gốc mặc dù nó đã được bốn eons kể từ khi tôi nhìn thấy nó).

Bắt tay bí mật là gì?

Trả lời

4

Tôi không chắc chắn chính xác bạn đang nhắm mục tiêu những gì phiên bản của Windows, nhưng những cái mới hơn sẽ cố gắng sử dụng tên sản phẩm thân thiện khi bạn sụp đổ.

Đảm bảo bạn thêm tài nguyên phiên bản vào tệp thực thi của mình và cung cấp tên sản phẩm và tên tệp thân thiện, trong chuỗi FileDescription.

Điều này page trên MSDN cung cấp thêm thông tin.

+0

Tôi đã thử nhiều chuỗi trong tài nguyên phiên bản và dường như không có hiệu ứng mong muốn nào. Đồng thời, chuỗi "Microsoft Internet Explorer" xuất hiện ở đâu đó trong tài nguyên phiên bản của nó, nhưng chuỗi này không xuất hiện trong các cảnh báo sự cố của nó (theo trang web - gần đây tôi không thấy nó sụp đổ). –

+0

Ồ, và tôi cần hỗ trợ XP 32 SP3. Bạn sẽ sử dụng chuỗi phiên bản nào cho tên "thân thiện"? Trang này dường như không nói rằng tôi nên mong đợi bất kỳ ai trong số họ hoạt động: http://msdn.microsoft.com/en-us/library/ms646987(VS.85).aspx –

+0

Internet Explorer (những gì xuất hiện trong hộp thoại sụp đổ) chắc chắn xuất hiện trong tài nguyên phiên bản của IE, tôi chỉ xem xét nó. Bạn đang nhắm mục tiêu hệ điều hành nào và bạn có thể bao gồm đoạn mã có liên quan từ tệp .RC của mình không. – Michael

0

Bạn không thể tạo một tài nguyên chuỗi đơn giản có chứa tên thân thiện của ứng dụng của bạn và sử dụng nó khi định dạng tin nhắn?

Bạn nghĩ sao?

Hy vọng điều này sẽ giúp, Trân trọng, Tom.

+0

Tin nhắn này không được đăng bởi ứng dụng của tôi; nó được đăng bởi Windows. Mã của tôi không nằm trong tầm kiểm soát. –

+0

@Integer Poet: Bạn đã thử một liên kết phím tắt đến ứng dụng chưa? Tôi đang tự bắn mình vào chân này và chụp một nồi dài trên đó ... :( – t0mm13b

+0

Tạo lối tắt có tên thân thiện không giúp được. IShellLink hỗ trợ mô tả phím tắt có thể được sử dụng.Về mặt lý thuyết có thể yêu cầu Windows Explorer mở một phím tắt với mô tả sẽ gây ra việc sử dụng một số giao diện không có giấy tờ để đặt tên thân thiện của quy trình, nhưng tôi nghi ngờ điều đó. Có thể đáng nghiên cứu bất chấp sự nghi ngờ của tôi, ngoại trừ việc tôi không có tùy chọn yêu cầu Windows Explorer khởi chạy quy trình bằng cách gián tiếp thông qua phím tắt vì tôi đã có mã hiện tại mà tôi không thể thay đổi cuộc gọi nào CreateProcess. –

1

Tại sao không chỉ đổi tên ứng dụng của bạn có thể thực thi FooBrowser™.exe?

+0

Quá nhiều chương trình khác phụ thuộc vào tên tệp EXE vẫn giữ nguyên. –

+0

Đồng thời, ".exe" là một phần của sự cố. –

1

hmm. Tôi không biết nếu điều này là để chắc chắn những gì sẽ làm điều đó, nhưng nó có giá trị một thử. Hãy thử xem xét SetCurrentProcessExplicitAppUserModelID

+0

Có vẻ không liên quan. –

+0

API đó được sử dụng để kiểm soát cách cửa sổ được nhóm lại với nhau trên thanh tác vụ (các mục thanh tác vụ khác nhau cho các cửa sổ từ cùng một quá trình hoặc một mục thanh tác vụ cho nhiều quy trình.) – Michael

2

Sự hiểu biết của tôi là khi ngoại lệ của bạn phát sinh lên hệ điều hành, bạn sẽ không may mắn. Cách tiếp cận của tôi là bắt ngoại lệ trước khi nó đạt đến hệ điều hành. Trong các ứng dụng của tôi, tôi có một biểu mẫu mà tôi hiển thị khi tôi có ngoại lệ chưa được xử lý cho phép người dùng gửi báo cáo lỗi, ngăn không cho hệ điều hành hiển thị biểu mẫu mà bạn đang nói đến.

Chỉ cần một góc độ khác nhau :)

+0

SEH __catch là thứ tôi đang cân nhắc, vì vậy cảm ơn bạn đã xác nhận một cách tiếp cận khả thi. –

+0

Lưu ý rằng việc chạy mã trong ngữ cảnh của một quá trình bị lỗi là rất nguy hiểm. Bạn có thể đăng ký với MS để nhận dữ liệu sự cố từ ứng dụng của bạn mà người dùng gửi. – Michael

+0

@ Michael - Có thể rủi ro, vâng. Tôi mã chủ yếu trong C# vì vậy tôi có một thử ... bắt xung quanh Application.Run của tôi(). Các ứng dụng không được quản lý có thể hơi khác một chút. Đối với đăng ký với MS ... đã không nhận thức được điều đó! –

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