के साथ shared_ptr का उपयोग करके एक हैंडल राय-अनुपालन बनाना मैंने हाल ही में SO पर RAII के बारे में एक सामान्य प्रश्न पोस्ट किया है। हालांकि, मेरे पास अभी भी मेरे हैंडल उदाहरण के साथ कुछ कार्यान्वयन समस्याएं हैं।कस्टम डिलीटर
ए HANDLE
void *
windows.h
में टाइप किया गया है। इसलिए, सही shared_ptr
परिभाषा
std::tr1::shared_ptr<void> myHandle (INVALID_HANDLE_VALUE, CloseHandle);
उदाहरण 1CreateToolhelp32Snapshot
होने की जरूरत है: HANDLE
और काम करता है देता है।
const std::tr1::shared_ptr<void> h
(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL), CloseHandle);
मैं परिभाषा (सही तरीका है क्या?) समस्याओं, पर जाना जब मैं कुछ और WinAPI इस सूचक के साथ आदेशों कॉल करने के लिए कोशिश में void
का उपयोग करते हैं। वे कार्यात्मक रूप से काम करते हैं, लेकिन बदसूरत हैं और मुझे यकीन है कि एक बेहतर समाधान होना चाहिए।
निम्नलिखित उदाहरणों में, h
एक सूचक है जो शीर्ष पर परिभाषा के माध्यम से बनाया गया था।
उदाहरण 2OpenProcessToken
: अंतिम तर्क PHANDLE
है। कास्ट के साथ मध्यम बदसूरत।
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
(PHANDLE)&h);
उदाहरण 3Process32First
: पहला तर्क एक HANDLE
है। वास्तव में बदसूरत।
Process32First(*((PHANDLE)&h), &pEntry);
उदाहरण 4 एक निरंतर HANDLE
के साथ सरल तुलना। वास्तव में बदसूरत।
if (*((PHANDLE)&h) == INVALID_HANDLE) { /* do something */ }
हैंडल के लिए उचित साझा_प्टर बनाने का सही तरीका क्या है?
क्या आपके पहले उदाहरण 2 कोड स्निपेट में इसे सुरक्षित करने के बाद असुरक्षित 'हैंडल' को हटाने की संभावना है? – Etan
आप OpenProcessHandle() को एक फ़ंक्शन रैपिंग बना सकते हैं (मैंने इसे पोस्ट में जोड़ा है) या दूसरे स्निपेट की तुलना में वही काम करते हैं, साझा_h INVALID_HANDLE_VALUE –