2010-02-01 43 views
16

Tôi đang tích hợp SDK dựa trên C của bên thứ ba vào ứng dụng .NET của mình. Ứng dụng sẽ chạy như một dịch vụ Windows trên một máy chủ, vì vậy nó không nên tương tác với người dùng theo bất kỳ cách nào.Làm cách nào để ngăn thư viện của bên thứ ba hiển thị MessageBox?

Thật không may, trong một số điều kiện lỗi nhất định, nó nhấn mạnh vào việc gọi MessageBoxA, có lẽ là để báo cáo điều gì đó xấu đã xảy ra. Khi điều này xảy ra, dịch vụ sẽ ngừng phản hồi. Tôi đoán rằng nó đang chờ ai đó bấm Ok?

Không thể để nhà cung cấp thay đổi mã của họ cho tôi.

Có cách nào tôi có thể thực hiện cuộc gọi này thành no-op để mã của tôi có thể tự động xử lý tình huống này không?

EDIT: Có thể điều quan trọng cần lưu ý là trong trường hợp cụ thể của tôi dịch vụ sẽ tự động khởi động lại nếu nó bị lỗi. Một lối thoát bất ngờ (có thể) và đột ngột có lẽ là độ phân giải tốt nhất cho một tình huống mà một MessageBox được hiển thị trong trường hợp của tôi.

+9

Nó không phải là một câu trả lời thực sự tôi biết, nhưng tìm thấy một thư viện/dịch vụ tốt hơn. Nếu một thư viện có loại vấn đề này, nó phải chịu nhiều hơn. –

+0

Tôi nhớ một cựu đồng nghiệp ngốc của tôi đặt trong một hộp thư trong mã được biết đến là một dịch vụ.Tôi đã nói với anh ta để loại bỏ nó nhưng anh ấy vẫn còn lại nó và chúng tôi đã phải phát hành lại phần mềm ... là không tốt. – Tim

+0

Không, nói nó không phải là một MessageBox từ một thư viện !!!! Câu hỏi hay –

Trả lời

10

Khám phá Detours from Microsoft Research. Nó cho phép bạn đi vòng quanh các hàm Windows API tùy ý. Cần lập trình C/C++ để làm cho nó hoạt động. Bạn sẽ không cần nhiều.

+0

Wow, không biết bạn có thể làm điều đó. – Jeremy

+2

@nobugz Bạn giống như một thư viện. Nghiêm túc. –

+0

Tôi đã đọc câu trả lời của nobugz ở đây và các diễn đàn MSDN, và tôi tin rằng anh ta là Dave Cutler. –

3

Bạn có thể sử dụng trình chỉnh sửa để tìm vị trí của điều này và xóa cuộc gọi khỏi nhị phân của chúng. Nhưng điều đó có thể hoặc không được phép theo các hạn chế sử dụng với phần mềm. Chắc chắn nếu bạn tái phân phối nó, nó có thể gây ra vấn đề - bạn nên hỏi nhà cung cấp và báo cáo nó như là một khiếm khuyết và đề nghị bạn có một cách giải quyết cho việc sử dụng của riêng bạn. Đối với những người sử dụng để làm điều này loại (nứt giấy phép hoặc kỹ thuật đảo ngược khác) này là khá đơn giản, nhưng câu hỏi thực sự là, những gì sẽ xảy ra nếu nó bị bỏ qua - hiện nó vẫn tiếp tục hoạt động ?.

+1

Crashing là ok trong trường hợp này. Nó là tồi tệ hơn cho các dịch vụ để treo như nó. – Jeremy

+0

Sau đó, nếu bạn biết nó là ok để ngăn chặn bạn cũng có thể chỉ cần thoát khỏi quá trình và sử dụng một số cơ quan giám sát khác để mang lại cho nó sao lưu khi không tìm thấy chạy. Tôi muốn tránh sự phức tạp đó nếu tôi có thể và chỉ xem bạn có thể tránh được việc KHÔNG MỞ nó không. Sau đó, tất nhiên vấn đề pháp lý với phân phối/sử dụng? Nếu bạn không biết bất cứ ai có khả năng, tôi biết ai đó đã từng báo cáo với tôi rằng những người yêu thích các chương trình phân tích kỹ thuật ngược lại. – Tim

+0

Đã có một cơ quan giám sát sắp xếp - nếu chương trình bị lỗi, chương trình sẽ tự động được khởi động lại. Đó là lý do tại sao nó rất bực bội với tôi rằng nó bị treo! :) Tôi cũng không biết vấn đề pháp lý. – Jeremy

0

Điều này không dễ dàng. Tôi nghĩ cách duy nhất là viết một cái móc thông điệp để bẫy các thông điệp được bơm qua tất cả các vòng tin nhắn của cửa sổ trên hệ thống. Nhưng tôi thậm chí không chắc chắn rằng một dịch vụ có thể tạo ra một móc tin nhắn cho nó không có quyền truy cập vào trạm cửa sổ mặc định theo thông tin đăng nhập mặc định của nó (LocalSystem). Vì vậy, nhiệm vụ # một sẽ là để xem nếu điều đó thực sự sẽ làm việc.

Nhưng đây là một phác thảo sơ bộ như thế nào tôi sẽ cố gắng để làm điều đó bên ngoài của một bối cảnh dịch vụ và bạn có thể xem nếu nó được áp dụng:

  1. Tạo một cửa sổ hook tin nhắn bẫy từ tất cả các hàng đợi thông điệp cửa sổ trên hệ thống.
  2. Bẫy tất cả thư WM_CREATE và thăm dò tham số CREATESTRUCT cho thư có thể bắt nguồn từ thư viện bên thứ ba của bạn. Bạn có thể phải đăng nhập tất cả các tin nhắn WM_CREATE và sau đó phân tích dữ liệu để xem cách bạn có thể phân biệt hộp thoại của thư viện với bất kỳ hộp thoại nào khác trên hệ thống. (Nhiều lần thành viên "lpszName" khác nhau giữa việc triển khai hộp thoại.)
  3. nếu bạn tin rằng WM_CREATE cụ thể đến từ thư viện của bạn, trả về một câu trả lời "đã xử lý" từ móc thư của bạn và không gọi trình xử lý tin nhắn tiếp theo trong chuỗi .

Đây là tất cả tâm trí rất dicey bạn, nhưng nó là con đường mà dường như nó có bất kỳ cơ hội cho tôi.

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