2009-01-30 10 views
14

कोई व्याख्या कर सकते हैं क्या PVOID है और यह कैसे की तरह एक समारोह में किया जाता है:पीवीओआईडी डेटा प्रकार क्या है?

BOOL DoSomething(PVOID pMemPhy) 
+0

संबंधित लिंक: [विंडोज डेटा प्रकार] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751 (v = vs.85) .aspx) – RAM

उत्तर

19

शून्य सूचक,

void *pMemPhy 
"उर्फ सूचक कुछ करने के लिए

के रूप में ही है, लेकिन यह आप पर निर्भर आंकड़ा करने के लिए यह बाहर"।

BOOL DoSomething (PVOID pMemPhy) 
{ 
    strcpy((char *)pMemPhy, "I love buffer overflows!"); 
    return TRUE; 
} 
1

ऐसा लगता है कि यह शून्य * के लिए केवल एक उपनाम (परिभाषित या टाइपिफ़) है। मुझे नहीं पता कि लोग क्यों सोचते हैं कि बेहतर होगा लेकिन मुझे पता है कि भविष्य में किसी प्रकार के बदलाव के कार्यान्वयन के मामले में कुछ एपीआई इसका उपयोग करना पसंद करते हैं।

मुझे पता है कि विंडोज़ के प्रारंभिक संस्करणों ने एसटीडीकॉल जैसी चीजों को कई कार्यों के लिए उपसर्ग के रूप में इस्तेमाल किया था और एसटीडीकॉल की परिभाषा आपके द्वारा संकलित विंडोज़ के किस संस्करण के आधार पर बदल सकती है। यह स्मृति से है (जो कई वर्षों के बाद शराब से प्रभावित होता है :-), इसलिए इस पर भरोसा न करें। यह मूल रूप से सही है लेकिन विवरण थोड़ा अलग हो सकता है।

4
typedef void * PVOID; 

यदि आप सवाल हैं तो एक शून्य सूचक क्या उपयोग है? सबसे आम उपयोग तब होता है जब आप स्मृति में पॉइंटर पास कर रहे हैं जो वास्तव में प्रकार की परवाह नहीं करता है। मुफ्त(), उदाहरण के लिए।

यदि कोई लाइब्रेरी एक फ़ंक्शन निर्यात करती है जो एकाधिक पॉइंटर प्रकार ले सकती है, लेकिन सी जैसे भाषाओं का समर्थन करना चाहती है जिसमें फ़ंक्शन ओवरलोडिंग नहीं है, तो शून्य * काम करता है।

11

यह शून्य सूचक - एक स्मृति पते के लिए एक सूचक जो उस बिंदु के प्रकार के बारे में कोई जानकारी नहीं है जिसके बारे में यह इंगित कर रहा है। इस कारण से, सूचक को पॉइंटर का उपयोग करने से पहले (char *)pMemPhy या (int *)pMemPhy जैसे पॉइंटर को डालना चाहिए ताकि संकलक जानता हो कि यह कितनी मेमोरी के साथ काम कर रहा है (एक char के लिए 1 बाइट, int के लिए 4 बाइट इत्यादि)

+0

@Jeremy Ruten, इस मामले में, यदि यह एक भौतिक स्मृति पता है, तो मुझे इसे क्या करना चाहिए? –

+0

इससे कोई फ़र्क नहीं पड़ता कि यह किस प्रकार का मेमोरी पता है (मुझे यकीन नहीं है कि "भौतिक स्मृति पता" से आपका क्या मतलब है), बस इसे अपने कार्य के रूप में करने के लिए जो भी प्रकार आप चाहते हैं उसे डालें। यह इस बात पर निर्भर करता है कि फ़ंक्शन क्या पूरा करना चाहता है, लेकिन मुझे लगता है कि अधिकांश समय आप (char *) पर डालेगा। –

+0

यह वास्तव में एक एपीआई समारोह है। विवरण के अनुसार, यह फ़ंक्शन एक इंटरफ़ेस कार्ड पर एक पोर्ट खोलता है। अधिक जानकारी उपलब्ध नहीं है इसलिए मुझे नहीं पता कि "PVOID pMemPhy" पैरामीटर को क्या बनाना है। –

4

जैसा कि अन्य ने कहा है, यह void * के बराबर है।

void संकेत अक्सर स्मृति परिचालन (memcpy, memset, आदि ...) में किया जाता है के बाद से एक दिए गए पते पर डेटा के प्रकार के ग्रहण करने के लिए नहीं चाहता है।

प्वाइंटर्स और शून्य पॉइंटर्स से this आलेख में एक अच्छा उपचार दिया जाता है।

4

यह और अन्य स्मारक जैसे कि BOOL, LPCTSTR के साथ यह मूल है, जिसे बीटीडब्लू को सी मानक के अस्तित्व से पहले विकसित किया गया था, और किसी विशेष कंपाइलर में निर्भर नहीं है, जिसने अपने स्वयं के प्रकारों का उपयोग किया था।

आप विंडोज विकास इतिहास के बारे में अधिक कहानियों के लिए ओल्ड न्यू थिंग ब्लॉग देख सकते हैं, और इसकी विषमताएं जो हमारे साथ रहेंगी (http://blogs.msdn.com/oldnewthing)।

+1

https://blogs.msdn.microsoft.com/oldnewthing/20080325-00/?p=23013/ – Eugene

संबंधित मुद्दे