Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 849
  • Last Modified:

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.");

    // .......
}


0
bormuth
Asked:
bormuth
1 Solution
 
jlsjlsCommented:
0
 
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
 
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
Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
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.

Join & Write a Comment

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Tackle projects and never again get stuck behind a technical roadblock.
Join Now