2015-09-29 42 views
2

當我用創建的緩衝區調用SetConsoleActiveScreenBuffer()時,似乎使ReadConsole停止使用ERROR_SHARING_VIOLATION。我已經檢查了處理權限,並且據我所知,它們是正確的。SetConsoleActiveScreenBuffer使ReadConsole返回ERROR_SHARING_VIOLATION

如果我將SetConsoleActiveScreenBuffer行註釋掉,則輸入完美。我可能在這裏做錯了什麼?

我也嘗試使用ReadFile而不是ReadConsole,並使用CreateFile而不是GetStdHandle獲取輸入緩衝區。兩種方式都會發生相同的錯誤。

#include <Windows.h> 
int main() 
{ 
     void* oldScreenBuffer; 
     void* screenBuffer; 
     void* inputBuffer; 
     char chBuffer[16]; 
     DWORD numReads; 
     int err = 0; 
     inputBuffer = GetStdHandle(STD_INPUT_HANDLE); 
     //inputBuffer = CreateFile(TEXT("CONIN$"), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); 
     oldScreenBuffer = GetStdHandle(STD_OUTPUT_HANDLE); 
     screenBuffer = CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE, 0, NULL, CONSOLE_TEXTMODE_BUFFER, NULL); 
     //commenting out the next line makes input work 
     err = SetConsoleActiveScreenBuffer(screenBuffer); 
     while(1){ 
       err = ReadConsole(inputBuffer, chBuffer, 15, &numReads, NULL); 
       if(!err){ 
         //returns error 32 (ERROR_SHARING_VIOLATION) 
         err=GetLastError(); 
       } 
       if(chBuffer[0]=='q') break; 
     } 
     SetConsoleActiveScreenBuffer(oldScreenBuffer); 
     return 0; 
} 
+1

您似乎忽略錯誤檢查。爲什麼? –

+4

由於您收到共享錯誤,請嘗試將非零值傳遞給共享模式。 'CreateConsoleScreenBuffer(GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,CONSOLE_TEXTMODE_BUFFER,NULL);' – Ben

+0

@davidHeffernan這只是產生錯誤的最簡單的代碼。我正在處理的實際代碼更復雜(幷包含錯誤檢查)。 –

回答

2

這是屏幕緩衝區共享模式的0。我之前完全錯過了。我將其更改爲FILE_SHARE_READ | FILE_SHARE_WRITE,它工作。 謝謝@Ben。