Gần đây tôi đã đăng câu hỏi chung về RAII tại SO. Tuy nhiên, tôi vẫn có một số vấn đề triển khai với ví dụ HANDLE của tôi.Thực hiện việc tuân thủ RAII HANDLE bằng shared_ptr với một deleter tùy chỉnh
A HANDLE
được nhập vào void *
trong windows.h
. Do đó, đúng shared_ptr
định nghĩa cần phải được
std::tr1::shared_ptr<void> myHandle (INVALID_HANDLE_VALUE, CloseHandle);
Ví dụ 1CreateToolhelp32Snapshot
: trả HANDLE
và các công trình.
const std::tr1::shared_ptr<void> h
(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL), CloseHandle);
Như tôi đã sử dụng void
trong định nghĩa (cách chính xác là bao nhiêu?) Vấn đề tiếp tục, khi tôi cố gắng gọi cho một số chi tiết WINAPI lệnh với con trỏ này. Họ hoạt động chức năng, nhưng xấu xí và tôi chắc chắn rằng phải có một giải pháp tốt hơn.
Trong các ví dụ sau, h
là một con trỏ được tạo thông qua định nghĩa ở trên cùng.
Ví dụ 2OpenProcessToken
: đối số cuối cùng là PHANDLE
. vừa xấu xí với dàn diễn viên.
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
(PHANDLE)&h);
Ví dụ 3Process32First
: số đầu tiên là một HANDLE
. Rất xấu.
Process32First(*((PHANDLE)&h), &pEntry);
Ví dụ 4 so sánh đơn giản với một hằng số HANDLE
. Rất xấu.
if (*((PHANDLE)&h) == INVALID_HANDLE) { /* do something */ }
Cách chính xác để tạo shared_ptr đúng cho HANDLE là gì?
có khả năng nào để xóa "HANDLE' không an toàn sau khi chuyển đổi nó thành an toàn trong đoạn mã ví dụ 2 đầu tiên của bạn không? – Etan
Bạn có thể tạo một hàm bao bọc OpenProcessHandle() (Tôi đã thêm nó vào bài đăng) hoặc làm điều tương tự hơn trong đoạn thứ hai, với shared_h được khởi tạo thành INVALID_HANDLE_VALUE –