2017-03-08 144 views
0

當試圖使用WriteConsoleOutputCharacter函數時,應用程序崩潰。C++ WinAPI - WriteConsoleOutputCharacter崩潰控制檯應用程序

COORD pos; 
pos.X = 0; 
pos.Y = 0; 

HANDLE buffer = GetStdHandle(STD_OUTPUT_HANDLE); 
LPDWORD written; 

char* str = "s"; 
WriteConsoleOutputCharacter(buffer, str, strlen(str), pos, written); 

但WriteConsole功能正常工作:

WriteConsole(buffer1,str,strlen(str),written,NULL); 

我沒有得到任何錯誤,但Windows的「應用程序停止響應」通知,我不能使用調試器,因爲IDE我正在使用(Dev C++ 5.11)已經失效了。

在此先感謝!

+0

'寫的LPDWORD' - 當然是崩潰。你需要使用'DWORD write'和'WriteConsoleOutputCharacter(buffer,str,strlen(str),pos,&written);' – RbMm

回答

2

變量在哪裏written指向?該函數將取消引用該參數以設置寫入的字符數。如果該變量未初始化,則它將具有未定值值,並且看似指向隨機位置,導致取消引用時導致未定義行爲

而是使用普通DWORD,並使用地址的運營商&

DWORD written; 

WriteConsoleOutputCharacter(buffer, str, strlen(str), pos, &written); 
//              ^
//       Note the address-of operator here 

或者,如果你不感興趣,有多少個字符寫入,通過nullptr代替。

+0

嗯,DWORD和LPDWORD有什麼區別?指向LPDWORD變量導致此錯誤 - 無法將'DWORD ** {aka long unsigned int **}'轉換爲'LPDWORD {aka long unsigned int *}' - 。相反,指向DWORD變量正常工作。謝謝! –

+0

@SimoneBondi'LPDWORD'是'long *'的宏。所以,如果你寫了'LPDWORD','你基本上'寫'長''。 'P'代表*指針*。 –