2011-11-08 5 views
7

tôi thực hiện cuộc gọi đến CoInitializeEx, cụ thể:Điều quan trọng là gọi CoUninitialize trên một chuỗi sẽ bị chấm dứt trước khi thoát khỏi ứng dụng của tôi?

CoInitializeEx(NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED); 

Trong đề mà ứng dụng của tôi tạo ra, nhưng sau đó chấm dứt trước khi thoát khỏi ứng dụng. Điều quan trọng là ghép nối chúng với các cuộc gọi CoUninitialize, hoặc làm các tài nguyên đó được giải phóng khi các chủ đề chấm dứt?

+1

Thậm chí nếu việc này không quan trọng, tại sao bạn không ghép nối chúng? –

+0

Vì mã đã được thử nghiệm và tôi không muốn thay đổi mã đó nếu thay đổi không liên quan, nhưng được thực hiện. – jeffm

Trả lời

14

Tài nguyên thường được trả về hệ thống khi quá trình chấm dứt, không phải khi một trong các chủ đề của nó thực hiện.

Tuy nhiên, CoUninitialize() không chỉ miễn phí tài nguyên và dỡ bỏ DLL, nó cũng đi vào một vòng lặp thông điệp phương thức để bơm các tin nhắn COM còn lại trước khi chủ đề chấm dứt. Các tài liệu cho biết:

Nếu có mở cuộc hội thoại còn lại, CoUninitialize bắt đầu một vòng lặp thông điệp phương thức và công văn bất kỳ thư đang chờ xử từ container hoặc máy chủ cho các ứng dụng COM này. Bằng cách gửi các thông báo , CoUninitialize đảm bảo rằng ứng dụng không thoát khỏi trước khi nhận tất cả các thư đang chờ xử lý của nó. Các thư không phải là COM được xóa .

Do đó, để tránh các lỗi RPC ở phía người gọi, tôi khuyên bạn nên làm theo lời khuyên của tài liệu và luôn gọi CoUninitialize() trước khi chấm dứt chủ đề có tên là CoInitializeEx().