2009-09-16 40 views
7

Tôi đang cố gắng xây dựng một dịch vụ Windows với MingW. Nó cần ngoại lệ an toàn cho thread, vì vậy tôi đã thêm cờ liên kết -mthreads. Ứng dụng hoạt động tốt từ dòng lệnh, nhưng khi tôi cố gắng khởi động nó từ services.msc, lỗi 1054 ("Dịch vụ không đáp ứng yêu cầu bắt đầu hoặc kiểm soát một cách kịp thời") được nêu ra. Dịch vụ sẽ bắt đầu nếu tôi xây dựng lại dịch vụ mà không có cờ -threads. Làm cách nào tôi có thể làm việc này với -máy đọc?Dịch vụ Windows đa luồng trong MingW

Trả lời

1

Tôi tự hỏi nếu bạn có thể gỡ lỗi khi nó chạy dưới dạng dịch vụ. Phải có một cái gì đó spooking chương trình của bạn khi máy chủ dịch vụ chạy nó. Có lẽ cố gắng đính kèm một trình gỡ rối vào svchost.exe, ít nhất bạn có thể xem những mô-đun nào được tải và có thể ngoại lệ nào gây ra sự cố.

+0

Việc đính kèm trình gỡ lỗi vào svchost.exe không có tác dụng. Dịch vụ không có cơ hội để bắt đầu. Lỗi được ném ngay cả trước đó. –

1

Ứng dụng của bạn có còn khởi động được không? Thực hiện cuộc gọi đến OutputDebugString (hoặc tương đương) ở đầu chức năng main của bạn để xem liệu nó có đạt được điều đó hay không. (Lấy DbgView từ SysInternals nếu bạn chưa có.)

Nếu nó không đi xa đến vậy, chúng tôi bắt đầu kiểm tra rõ ràng: có phải ứng dụng không tìm thấy DLL thời gian không? Nó có thể là bạn có thời gian chạy thường xuyên trong PATH của nó, nhưng nó không thể tìm thấy phiên bản MT. Điều đó có thể giải thích hành vi bạn mô tả. Bạn có thể cần phải sao chép thời gian chạy MT hoặc cập nhật PATH cho phù hợp.

+0

Ứng dụng thậm chí không bắt đầu. Nhưng nó chạy từ dòng lệnh. Vì vậy, nó không thể là vấn đề với các thư viện thời gian chạy. –

+0

Phiên bản MT của thư viện thời gian chạy ở đâu? Nó phải nằm trong thư mục ứng dụng. Có lẽ các thư viện thời gian chạy có sẵn trong PATH khi chạy như người dùng của bạn, nhưng không phải là hệ thống. Sử dụng depends.exe để theo dõi dll của bạn đang phụ thuộc vào. Bạn cũng có thể thử chạy ứng dụng với tư cách người dùng khác. –

5

Tôi nghi ngờ -máy tính đang mang phụ thuộc vào một DLL và DLL đó không nằm trên đường dẫn khi nó đang chạy dưới dạng dịch vụ. Trong môi trường Cygwin của tôi, nếu tôi biên dịch một chương trình tầm thường với "-mno-cygwin -mthreads", tôi nhận được một sự phụ thuộc vào MINGWM10.DLL, mà chắc chắn sẽ không có trên đường dẫn khi chạy như một dịch vụ. Nếu tôi thử chạy nó mà không có tập PATH, nó đổ vỡ khi nó bắt đầu tải (và để lại một turd trong Nhật ký sự kiện ứng dụng).

Tôi muốn đưa exe của bạn vào Dependency Walker (http://www.dependencywalker.com) để xem bạn đang tải gì vào thời gian tải và kiểm tra Nhật ký sự kiện Windows để xem có bất kỳ gợi ý nào không. Bạn có thể sẽ cần phải đặt một bản sao của các DLL nó cần cùng với thực thi.

2

Bạn cần mingwm10.dll trong thư mục làm việc hoặc trong [sửa: hệ thống, không phải cho mỗi người dùng] PATH, vì các chương trình C++ được biên dịch với tùy chọn -mthread có phụ thuộc đó. Nếu bạn khá chắc chắn ngoại lệ sẽ không bao giờ được ném bởi mã của bạn cũng không propogate thông qua ngăn xếp của bạn, sử dụng -fno-exception thay vì -mthread để giải quyết sự phụ thuộc.