2009-07-22 38 views
5

Tôi bắt đầu phát triển một dịch vụ Windows. Tôi muốn sử dụng một số lớp học của riêng tôi, có ít phụ thuộc vào một số lớp MFC như CString, CSocket, CArchive, CMemFile và CObject. MSDN nói rằng bạn cần phải rất cẩn thận về những phần của MFC bạn sử dụng trong dịch vụ Windows, nhưng không chỉ định nó và không mô tả các vấn đề có thể xảy ra.Sử dụng dịch vụ MFC trong Windows?

Câu hỏi của tôi là:

  • phần nào của MFC có thể được sử dụng?
  • tôi có thể gặp phải vấn đề gì khi sử dụng MFC?
  • những phần nào của dịch vụ Windows quan trọng đối với việc sử dụng MFC?
  • có nên sử dụng ATL thay vì MFC cho dịch vụ Windows không?

Trả lời

4

Tôi không chắc chắn ý nghĩa của chúng trong bài viết MSDN. Miễn là bạn không sử dụng bất kỳ chức năng GUI nào, bạn sẽ ổn - nhưng đó là vấn đề thiết kế chung khi phát triển các dịch vụ.

Điều đó đang được nói, ATL có chức năng được thiết kế đặc biệt để xây dựng các dịch vụ IIRC để bạn có thể sử dụng tốt hơn điều đó.

Để trả lời câu hỏi của bạn (theo sự hiểu biết của tôi):

1) những người bạn chỉ định là không có vấn đề.

2) Tôi đoán chúng có nghĩa là sự cố đồng bộ hóa với các thành phần giao diện người dùng. Miễn là bạn không sử dụng bất kỳ lớp học có nguồn gốc từ CWnd bạn sẽ được tốt.

3) không hiểu câu hỏi.

4) Xem trước, cộng với ATL nhẹ hơn, do đó bạn sẽ phải phân phối ít hơn và cung cấp chức năng tích hợp sẽ làm giảm đau để phát triển dịch vụ. Xem ví dụ CAtlServiceModuleT. Bạn vẫn sẽ có thể chủ yếu sử dụng các lớp học của riêng bạn, như CString được chia sẻ giữa MFC và ATL ngày nay và ATL có các lớp cho lập trình socket và bản đồ tập tin bộ nhớ chính nó. Nó không tương đương với CArchive, và tôi không chắc bạn sử dụng chức năng nào trong CObject vì vậy tôi không thể nói liệu có tương đương với ATL hay không. Vì vậy, để kết luận, tôi muốn nói 'có' cho câu hỏi này.

3

(Tôi biết câu trả lời này là hơi muộn và câu hỏi này đã được trả lời nhưng MFC trong dịch vụ là một điểm đau đối với tôi ...)

CSockets, xa như tôi nhớ lại, đòi hỏi phải có Window. Nó làm cho một ẩn trong nền. Tôi phát hiện ra điều này một cách khó khăn khi tôi đã thử bao gồm một số mã MFC trước khi xuất hiện vào một dịch vụ cửa sổ. Có lẽ điều này chỉ được yêu cầu nếu bạn chấp nhận kết nối socket - tôi không thể nhớ lại? Nhưng nó không hoạt động! (Làm thế nào chính xác tôi lãng phí rất nhiều thời gian làm điều này w/o nhận ra giới hạn này là một câu chuyện dài)

CObject? Nếu bạn cần các công cụ id thời gian chạy sử dụng RTTI (dynamic_cast, vv ...)

CString, tôi thích CString, tôi biết nó được chia sẻ với ATL bây giờ, không chắc chắn nếu bạn kéo nó trong w/o MFC hoặc ATL bao gồm ... Bạn có thể sử dụng std :: string. Ngoài ra, tôi nhớ lại một ai đó đã tạo ra một std :: string đã cung cấp các phương thức giống như CString. (EDIT: tìm thấy code - người đàn ông !! đó là một vụ nổ từ quá khứ ...)

CArchive, CMemFile: bạn có thực sự cần những thứ này không?

Dù sao, như Roel đã nói, ATL có thể hữu ích hơn. Tôi sẽ không sử dụng MFC trong một ứng dụng phía máy chủ (bao giờ!) ATL? Có lẽ. Nếu tôi cần COM, chắc chắn. Không có COM nhưng đối với CAtlServiceModuleT, v.v ... có thể ....

+0

Cảm ơn bạn đã chia sẻ trải nghiệm của mình! – mem64k

+1

Tôi thấy rằng liên kết tải xuống không hoạt động đối với thay thế CString, nhưng cũng tìm thấy điều tương tự (tôi nghĩ) trên CodeProject http://www.codeproject.com/KB/string/stdstring.aspx –

+0

Cảm ơn GH! Liên kết của bạn là cùng một lớp ("Stud" chuỗi) Tôi đã đề cập quá! - Tôi sẽ cập nhật liên kết trong câu trả lời của tôi. Tôi biết đây là dự án tương tự kể từ khi tôi nhớ nhận xét này trong nguồn: "Xin đừng đổ lỗi cho tôi nếu nó gây ra vệ tinh $ 30 tỷ đô la của bạn phát nổ trong quỹ đạo." – Aardvark

0

Và một điều xấu nữa về MFC trong các dịch vụ mà tôi vừa trải qua khi cố gắng biến ứng dụng MFC-ATL thông thường thành dịch vụ: Sử dụng AfxConnectionAdvise() thực sự vô ích nếu không có một thủ tục Window. Các chủ đề trong dịch vụ của tôi chỉ là các luồng thông báo không bơm thông thường. Tôi tin rằng đây là lý do tại sao tôi không bao giờ nhận được các sự kiện được kích hoạt từ một máy chủ COM khác mà tôi đã phát triển. Đó là máy chủ COM khác treo trên Fire_xxxEvent(), gây ra một mớ hỗn độn lớn trong toàn bộ hệ thống.

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