Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > console application


Автор: kuzyara 2.7.2008, 17:36
скажите пожалуйста, как сделать так, чтобы по нажатию кнопки запускалось консольное приложение (Console Wizard) в коммандной строке, но не ShellExeute'ом, а чтоб прям исходники править можно было. 

Я сначала для консоли писал, потом сказали переделать под vcl, может быть как-нибудь можно с минимальными потерями?

Автор: Любитель 2.7.2008, 17:45
Ты сам понял, что сказал?! Если речь об интеграции имеющегося кода cin/cout - то смотри перенаправление ввода/вывода и AllocConsole в MSDN.

Автор: kuzyara 3.7.2008, 11:21
спасибо за наводку, вот накапал:
Код

bool CreateConsole()
{

     FreeConsole();
     if (AllocConsole())
     {
       SetConsoleOutputCP(1251); // Чтобы русские буквы отображать
       int hCrt = _open_osfhandle((long) GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
       FILE *f=::_fdopen(hCrt, "w");
       if(setvbuf(f, NULL, _IONBF, 0)==0)
       {
            *stdout = *f;
            *stderr = *f;
            return false;
       }
     }
     return true;
}


void __fastcall TForm1::Button1Click(TObject *Sender)
{
    CreateConsole();
       int x;
      for(int i=0;i<20;i++)
        std::cout << i << "\n";
       std::cin >> x;
       std::cout << "Проба\n";
    

}



А как сделать, чтобы консоль в конце закрыалась? 
Типа  cout >> "Press anykey to exit..."; getch();?

Автор: Любитель 3.7.2008, 13:47
Для закрытия - вызови просто в нужный момент FreeConsole.

Автор: kuzyara 4.7.2008, 07:54
в том то и дело, что сразу закрывает, не дождавжись введения символа! 
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <iostream> 
#include <io.h> 
#include <stdio.h>
#include <conio.h>
#include <fcntl.h>


#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

//---------------------------------------------------------------------------

bool CreateConsole()
{

     FreeConsole();
     if (AllocConsole())
     {
       SetConsoleOutputCP(1251); // ×òîáû ðóññêèå áóêâû îòîáðàæàòü
       int hCrt = _open_osfhandle((long) GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
       FILE *f=::_fdopen(hCrt, "w");
       if(setvbuf(f, NULL, _IONBF, 0)==0)
       {
            *stdout = *f;
            *stderr = *f;
            return false;
       }
     }
     return true;
}


__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{


}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    CreateConsole();
       int x;
      for(int i=0;i<20;i++)
        std::cout << i << "\n";
       std::cin >> x;
       std::cout << "Ïðîáà\n";
        getch();
        FreeConsole();

}
//---------------------------------------------------------------------------


Консоль появляется на долю секунды, потом закрывается, а нужно, чтобы после гетчара закрывалась! Подскажите в чём дело, буду очень благодарен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)