मैं अतुल्यकालिक रूप से चलाने के लिए सेटअप ReadFile
कोशिश कर रहा हूँ और MSDN के अनुसार, मैं स्थापित करने के लिए lpNumberOfBytesRead
null
करने की जरूरत है: "। इस पैरामीटर के लिए शून्य का प्रयोग करता है, तो यह एक अतुल्यकालिक आपरेशन संभावित गलत परिणाम से बचने के लिए है"IntPtr.Zero शून्य के बराबर है?
उदाहरण के लिए
, अगर मैं निम्नलिखित है:
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool ReadFile(
IntPtr hFile,
out byte[] aBuffer,
int cbToRead,
IntPtr cbThatWereRead,
ref OVERLAPPED pOverlapped
);
और मैं इस तरह इसे कहते (4 पैरामीटर अशक्त किया जा रहा होने के इरादे से):
Win32API.ReadFile(readHandle, out data_read, Win32API.BUFFER_SIZE, IntPtr.Zero, ref over_lapped);
इच्छा है कि इसे शून्य के साथ बुलाओ जैसा ही हो? यदि नहीं, तो घोषणा में या फ़ंक्शन कॉल में मुझे क्या बदलना चाहिए?
मैं अगर मैं hFile
संदर्भ के लिए SafeHandle
या HandleRef
बजाय IntPtr
का उपयोग करना चाहिए भी उत्सुक था? मुझे यह सुनिश्चित करना है कि मैं CloseHandle(IntPtr)
के साथ हैंडल को बंद कर दूं, जब मैं इसके साथ कर रहा हूं, तो सुनिश्चित करें कि IntPtr
पर अन्य दो विकल्पों का उपयोग करने का कोई कारण नहीं है। मैं असुरक्षित कोड का उपयोग करने से बचने की कोशिश भी कर रहा हूं।
संपादित करें: जैसा कि यह पता चला है, मुझे चौथे पैरामीटर को IntPtr.Zero
पर सेट नहीं करना चाहिए, क्योंकि मैं असीमित रूप से चल रहा हूं, फिर भी यह अभी भी वापस आ सकता है। Asynchronous Disk I/O देखें। आह, मुझे कहानियों के विरोधाभास से प्यार है।
पिछली पोस्ट के लिए खेद है, लेकिन यह एक बग नहीं है क्योंकि IntPtr.Zero शून्य के बराबर नहीं है - ताकि अगर कथन काम नहीं करेगा। – Kobunite
@ कोबुनिट फिर 'if (IntPtr.Zero == "हैलो") लिखने का प्रयास करें और देखें कि क्या होता है। एक संकलन-समय त्रुटि होगी ... समस्या यह है कि कोई चेतावनी नहीं है कि तुलना असंभव है, और कोई त्रुटि नहीं है। कोड बस संकलक द्वारा हटा दिया जाता है। आईएल कोड जेनरेट किया गया http://goo.gl/6zpPxN – xanatos
नेक्रो के लिए खेद है, लेकिन यह संकलित करता है क्योंकि यह '==' ऑपरेटर ओवरलोड को प्रभावी रूप से '(IntPtr?) IntPtr.Zero == (IntPtr?) null' – Marc