Avatar billede abpdk Nybegynder
06. maj 2003 - 15:30 Der er 17 kommentarer og
1 løsning

Windows applikation MED konsol

Hvordan kompiler man en Windows/GUI applikation med tilhørende konsol/prompt?

Jeg bruger Borlands C++ 5.5 compiler.

//abpdk
Avatar billede tam Nybegynder
06. maj 2003 - 21:59 #1
Hvad mener du?
Avatar billede abpdk Nybegynder
06. maj 2003 - 22:30 #2
Hehe, en af grundene til at jeg spørger her var også at jeg ikke vidste hvordan jeg skulle formulere mine Google-søgniner ;)

Normalt bruger jeg Delphi, og der er en option der hedder "Generate console application" der gør at compileren laver en GUI application OG en dertilhørende konsol. Selvom jeg ved en del om diverse programmeringssprog ved jeg ikke helt hvad der er den gør, men jeg tænker at det samme også må kunne lade sig gøre i c/c++.

Det er egentlig ikke væsenligt hvordan der bliver gjort, men jeg bruger kun mit vindue til OpenGL så jeg vil ikke til at rode med en masse GUI-komponenter. Jeg skal bare ha' sådan at jeg f.eks. kan udskrive test-strenge i en konsol.

Håber det gav lidt mere mening.
Avatar billede tam Nybegynder
06. maj 2003 - 22:48 #3
En windows app er _enten_ en GUI eller en Console application. Der er ikke nogen blanding.

Jeg har godt nok kodet i delphi for mange år siden, men jeg kan ikke mindes noget GUI når du vælger Console App.
Når du kører programmet viser den da kun en console og ikke en form... (Er det ikke korrekt?)
Avatar billede abpdk Nybegynder
06. maj 2003 - 23:19 #4
Som sagt ved jeg ikke helt præcist hvordan det fungerer, men hvis du i Delphi f.eks. opretter en ny applikation (gui) og så vælger "Generate console application" under Project->Options->Linker så kører den GUI'en med en konsol i baggrunden.
Avatar billede abpdk Nybegynder
06. maj 2003 - 23:21 #5
Under Delphi's hjælpe står følgende:
"Causes linker to set a flag in the application’s .EXE file indicating a console mode application."
...men om det betyder at det så bliver til en konsol-applikation der viser en gui ved jeg ikke (og i givet fald heller ikke hvordan det fungerer), men det er meget muligt.
Avatar billede tam Nybegynder
07. maj 2003 - 01:16 #6
Det kan jeg ikke lige svare på, jeg har en bror der er delphi expert, jeg vil lige høre ham i morgen...
Avatar billede abpdk Nybegynder
07. maj 2003 - 01:16 #7
OK, men husk lige at det er c/c++ jeg spørger efter.
Avatar billede tam Nybegynder
07. maj 2003 - 01:18 #8
Det ved jeg, og jeg koder også kun C++ selv :)
Avatar billede segmose Nybegynder
07. maj 2003 - 08:42 #9
To create a console application:

1.    In the Project Manager, select TestProjectGroup, right-click, and choose Add New Project.

The New dialog box appears.

2.    Choose Console Wizard. The Console Wizard dialog box is displayed.
3.    Select the source type (C or C++) and make sure Console Application is checked. (Use VCL/CLX should be unchecked unless you plan to use CLX or VCL objects in your console application.) Then click OK.
3.    Select the project in the Project Manager, right-click, and choose save, specifying a project name ConsoleApp.

Notice the project file has the .bpr extension. Be sure to save the file in the same directory as TestProjectGroup.

4.    Add the following code to the console application so that the file looks like this:

#include <conio>

    #include “HelloDLL.h”

    int main (int argc, char **argv)
    {
        cout << “Calling the DLL…” << endl;
        SayHello();
        cout << “Hit any key to close…” << endl;
        getch();
        return 0;

}

5.    Select the project, right-click, and choose Add to Project to add the DLL library to the project. In the Add to Project dialog box, choose File of Type: *.lib to get a list of library files, and select HelloDLL.lib. Notice C++Builder updates ConsoleApp.cpp to include HelloDLL.lib.
6. In the project options, select the Directories/Conditionals tab and set the intermediate output to OBJDCUS.

C++Builder places the intermediate .OBJs in the specified directory, which is created when the batch file runs.

7. Save the project.
Avatar billede abpdk Nybegynder
07. maj 2003 - 17:08 #10
segmose>> Det fungere sikkert fint nok i C++ Builder, jeg bruger som sagt kun C++ compileren (KUN kommando-prompt) så det hjælper mig ikke så meget.
Avatar billede tam Nybegynder
09. maj 2003 - 00:30 #11
Det Delphi den gør, det er at du laver en console application men den giver dig en "visuel form" som du kan droppe components på. F.eks. til database adgang eller lignende.
Men, den compiler en ganske almindelig console application.

Så bare lav en console application, det er det samme Delphi laver, da det visuelle er kun til "design time" det er ikke noget brugeren nogensinde vil se.

Som sagt før: En app der er en console application _kan_ ikke have en tilhørende GUI...
Avatar billede abpdk Nybegynder
09. maj 2003 - 14:58 #12
Det er meget muligt at det er det Delphi gør, men jeg tror ikke helt det er det jeg leder efter. Det jeg laver ER jo en windows-applikation og når den er færdig skal jeg ikke længere bruge konsollen, den er bare til at udskrive testdata i under udviklingsprocessen, så den skal helst være hurtigt at fjerne igen eller evt. kunne startes med en program-parameter.

Jeg fandt noget forleden med en funktion AllocConsole() (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/allocconsole.asp), hvor en windows-applikation kan allokere en enkelt konsol (eller lade være). Det virkere mere som det jeg søger, men jeg kunne desværre ikke få det til at virke. Noget i evt. kunne hjælpe med?
Avatar billede tam Nybegynder
09. maj 2003 - 17:04 #13
Ahhh, nu ved jeg hvad du mener...
Hvad fejl laver AllocConsole() når du kalder den? Kald GetLastError() og se hvad errorcode der er...

En helt anden mulighed er at bruge DebugView fra SysInternals http://sysinternals.com/ntw2k/freeware/debugview.shtml
Med den kan du se alt hvad din, og andre, applicationer skriver til OutputDebugString()

Jeg har brugt det selv, og det virker perfekt :)
Avatar billede abpdk Nybegynder
09. maj 2003 - 17:20 #14
AllocConsole laver faktisk ingen fejl, der sker bare ingen ting når jeg bruger cout. Jeg læste nogle eksempler hvor de skiftede rundt med nogle handles (noget med at applikationen skulle ha' handle'et til den nye konsol), men jeg fik det ikke til at virke.

Det med DebugView lyder fint, men jeg er faktisk blevet meget glad for idéen om at have en konsol man kan (fra)vælge med en program-parameter.

Hvis du kan finde (eller selv lave) et eksempel med AllocConsole der virker ville det være perfekt.
Avatar billede tam Nybegynder
10. maj 2003 - 00:47 #15
Hmmm, hur du får den til at virke med cout kan jeg ikke liiige finde...

Men, nedenstående kode virker fint, og skriver "test" i konsollen :)

if (AllocConsole())
{
    HANDLE console;
    if ((console = GetStdHandle(STD_OUTPUT_HANDLE)) != NVALID_HANDLE_VALUE)
    {
        DWORD dw;
        WriteConsole(console, "test\r\n", 6, &dw, NULL);
    }
}
Avatar billede tam Nybegynder
10. maj 2003 - 00:48 #16
Oops, det skulle være INVALID_HANDLE_VALUE og ikke NVALID_HANDLE_VALUE
Avatar billede soreno Praktikant
10. maj 2003 - 11:22 #17
En console app kan godt have en dertil hørende Dialog (eller Window).
Jeg bruger selv samme teknik når jeg leger med OpenGL - altså vise noget i et vindue og skrive log til console.

Hvordan det gøres i Borland ved jeg ikke, men i MinGW er eneste forskel:
Uden Console:
-mwindows

Med console:
(intet flag/option - er default enabled)

Jeg har kigget lidt nærmere på en exefil (lavet med MinGW).
Offset 220 (dec) er i en console app: 03
Offset 220 (dec) er i en windows app: 02

Men det er ikke generelt at det er sådan.
Avatar billede abpdk Nybegynder
10. maj 2003 - 15:01 #18
tam>> Det krævede lige et par ændringer i din kode for at få den til at udskrive mere end én gang, men nu virker det perfekt. Tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester