2011-11-19 21 views
11

İşte WINAPI en WriteFile kullanan bir "Merhaba dünya" programı (Microsoft Visual C++ 2008 Express derlenmiş): Bir konsol penceresi idam EğerStandart çıktıya yazarken WriteFile neden çöküyor?

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; 
} 

, bu mutlu dünyayı karşılıyor. Eğer WriteFile içinde

hello.exe > output.txt 

programı çöker (BOŞ işaretçi istisna) olduğu gibi, ancak, standart çıktıyı yeniden denerseniz. Bununla birlikte, output.txt var ve tümüyle doğru çıktıyı içeriyor.

kazasında çağrı yığını:

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

iletisi: "0x75ce85ea de işlenmeyen özel durum (KernelBase.dll) srgprc2.exe içinde: 0xc0000005:. Erişim ihlali yazma yeri 0x00000000"

Neler oluyor burda? Teşekkürler!

+3

CloseHandle() çağrısını kaldırın. –

+0

... açık olması gerektiği gibi, bir 'Get ...' işlevi, bir 'Open ...' fonksiyonu değil. –

+0

CloseHandle bile çağrılmıyor, kaza WriteFile'da gerçekleşiyor ve program sonlandırılıyor. – user38329

cevap

17

Dördüncü parametre, WriteFileis not optional. İzin verilmeyen NULL'u geçiyorsunuz. (Çok bayt aslında yazılı ne kadar söyler)

+3

D'OH! "Bu parametre yalnızca lpOverlapped parametresi NULL olmadığında NULL olabilir." http://msdn.microsoft.com/en-us/library/windows/desktop/aa365747%28v=vs.85%29.aspx – Mordachai

+0

Teşekkür ederiz. Prototipteki "__out_opt" beni şaşırttı. – user38329

+0

Aynı zamanda soruda bahsedilen OP ile aynı sorunu yaşıyorum. Ve hatırladığım kadarıyla, bu parametre için NULL'u da geçtim. Yani ... Büyük cevabınız için teşekkürler. ve evet ... +1 :) –

0

4 parametre bunu DWORD, duruma neden olur işaretçi değil null yazma girişiminde bu parametreye NULL geçmesi DWORD değeri (aka imzasız int) işaretçiyi bekliyor sadece bu argümana işaretçiyi geçmek zorunludur, ancak WriteFile yazdığınızdan daha az veri yazacak olmasına rağmen, olasılıkla yazımdan sonra her zaman değerini kontrol etmelisiniz.

İlgili konular