Using Win32 Console



I want to use the Win32 Console but when I call GetStdHandle, I get a handle that seems to be not valid.

The code should compile and show the following error after run:

Error: Could not receive buffer information.  --> The handle is invalid.


Did I forget any init step ... ?




#include <windows.h>
#include <iostream.h>

void error(string s) {
    LPVOID lpMsgBuf;
    FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS, 0, GetLastError(), MAKELANGID(LANG_NEUTRAL,
        SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0,0);
    std::cout << "Error: " << s << "  --> " << (std::string)(LPCTSTR)lpMsgBuf;
};

HANDLE _V_consoleOutputHandle, _V_consoleInputHandle;

void main()
{
     CONSOLE_SCREEN_BUFFER_INFO __csbi;

     _V_consoleOutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
     if (_V_consoleOutputHandle == INVALID_HANDLE_VALUE)
         error("Could not create output buffer handle.");
     _V_consoleInputHandle = GetStdHandle(STD_INPUT_HANDLE);
       if (_V_consoleInputHandle == INVALID_HANDLE_VALUE)
         error("Could not create input buffer handle.");

     if ( ! GetConsoleScreenBufferInfo(_V_consoleOutputHandle, &__csbi) )
         error("Could not receive buffer information.");

    // .......
}


bormuthAsked:
Who is Participating?
 
proskigCommented:
I have compiled your snippet on my machine and it worked. I had to change it to:

#include <windows.h>
#include <iostream>
#include <string>

void error(std::string s) {
   LPVOID lpMsgBuf;
   FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM |
       FORMAT_MESSAGE_IGNORE_INSERTS, 0, GetLastError(), MAKELANGID(LANG_NEUTRAL,
       SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0,0);
   std::cout << "Error: " << s << "  --> " << (std::string)(LPCTSTR)lpMsgBuf;
};


The rest was find. Try to debug and see actual value of _V_consoleOutputHandle. On my machine it was 7.
0
 
jlsjlsCommented:
0
 
MadYugoslavCommented:
Try to call GetConsoleScreenBufferInfo right after You get handle of output.
If it work it seems that your identifiers are to long for your compiler settings.
Make identifiers for handles shorter or set specific option to make them available to be longer then now.
0
Cloud Class® Course: Amazon Web Services - Basic

Are you thinking about creating an Amazon Web Services account for your business? Not sure where to start? In this course you’ll get an overview of the history of AWS and take a tour of their user interface.

 
bormuthAuthor Commented:


I used a shorter handle name nad even called GetConsoleScreenBufferInfo right after handle creation. The handle value is 0000044 but this still is NOT valid.

I use Borland C++ 5.5 and Windows 2000.

0
 
MadYugoslavCommented:
I made empty console application on Visual C with:

#include "stdafx.h"
#include <windows.h>
#include <iostream.h>

HANDLE _V_consoleOutputHandle, _V_consoleInputHandle;
void main()
{
   CONSOLE_SCREEN_BUFFER_INFO __csbi;
   int err=0;

   _V_consoleOutputHandle = GetStdHandle(STD_OUTPUT_HANDLE);
   if (_V_consoleOutputHandle == INVALID_HANDLE_VALUE)
      err=1;
   _V_consoleInputHandle = GetStdHandle(STD_INPUT_HANDLE);
   if (_V_consoleInputHandle == INVALID_HANDLE_VALUE)
      err=1;
   if ( ! GetConsoleScreenBufferInfo(_V_consoleOutputHandle, &__csbi) )
      err=1;
   printf("%d", err);
   getchar();
}

and output is 0 (OK).
0
 
MadYugoslavCommented:
May be You can try to change declaration for main function:

void main(void)

or

void main(int argc, char* argv[])
0
 
bormuthAuthor Commented:


OK

When I run the programm in a full screen 80*25 DOS window it works. But when I run it in a Console window (in my case 80*40) it doesn't.
0
 
bormuthAuthor Commented:

OK - it works


This code only runs on Win95 and following. My Console window was set to DOS mode ...

I gave th points to proskig because he gave me the idea that the code should work ..
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.