2011-11-19 16 views
11

यहाँ एक "हैलो दुनिया" कार्यक्रम WinAPI के WriteFile का उपयोग करता है है (माइक्रोसॉफ्ट विज़ुअल सी ++ 2008 एक्सप्रेस में संकलित):मानक आउटपुट पर लिखते समय WriteFile क्रैश क्यों करता है?

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    wchar_t str[] = L"Hello world"; 

    HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE); 
    if(out && out!=INVALID_HANDLE_VALUE) 
    { 
     WriteFile(out, str, sizeof(str), NULL, NULL); 
     CloseHandle(out); 
    } 

    return 0; 
} 

तो एक कंसोल विंडो में मार डाला है, यह खुशी से दुनिया को बधाई दी। आप अपने मानक आउटपुट पुनर्निर्देशित करने के लिए, तथापि, WriteFile में

hello.exe > output.txt 

कार्यक्रम दुर्घटनाओं (नल पॉइंटर एक्सेप्शन) में के रूप में प्रयास करें। फिर भी, output.txt मौजूद है और इसमें पूर्ण आउटपुट सही है।

दुर्घटना पर कॉल स्टैक:

[email protected]() + 0x75 bytes  
[email protected]() + 0x4e bytes  
srgprc2.exe!wmain(int argc=1, wchar_t * * argv=0x00483d88) Line 15 + 0x16 bytes C++ 

संदेश: "क्रिया के अपवाद 0x75ce85ea पर (KernelBase.dll) srgprc2.exe में: 0xc0000005:। पहुँच उल्लंघन लेखन स्थान 0x00000000"

यहां क्या हो रहा है? धन्यवाद!

+3

CloseHandle() कॉल को हटाएं। –

+0

... जैसा कि स्पष्ट होना चाहिए, क्योंकि आप 'प्राप्त करें ...' फ़ंक्शन का उपयोग कर रहे हैं, न कि 'ओपन ...' फ़ंक्शन। –

+0

क्लोजहैंडल को भी नहीं कहा जाता है, क्रैश लिखितफाइल में होता है और कार्यक्रम समाप्त हो जाता है। – user38329

उत्तर

17

WriteFileis not optional पर चौथा पैरामीटर। आप नल पास कर रहे हैं, जिसकी अनुमति नहीं है।

+3

डी ओएच! "यह पैरामीटर केवल तब हो सकता है जब lpOverlapped पैरामीटर न्यूल नहीं है।" http://msdn.microsoft.com/en-us/library/windows/desktop/aa365747%28v=vs.85%29.aspx – Mordachai

+0

धन्यवाद। प्रोटोटाइप में "__out_opt" ने मुझे भ्रमित कर दिया। – user38329

+0

प्रश्न में उल्लिखित ओपी के रूप में मुझे भी वही समस्या है। और जहां तक ​​मुझे याद है, मैंने भी उस पैरामीटर के लिए NULL पारित किया। तो ... आपके महान जवाब के लिए धन्यवाद। और हाँ ... +1 :) –

0

4 पैरामीटर (जो हमें बताता है कि कितना बाइट्स थे वास्तव में लिखा) DWORD मान (उर्फ अहस्ताक्षरित int) जब आप उस पैरामीटर यह DWORD सूचक जो अपवाद का कारण बनता है शून्य पर, नहीं लिखने के लिए प्रयास करता है करने के लिए शून्य पारित करने के लिए सूचक उम्मीद कर रही है केवल उस तर्क को पॉइंटर पास करना अनिवार्य है, लेकिन आपको हमेशा लिखने के बाद अपना मूल्य देखना चाहिए क्योंकि संभावना है हालांकि स्लिम है कि लिखित फ़ाइल आपके द्वारा प्रदान किए गए से कम डेटा लिखेगी।

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