Zum Inhalt springen

argc und argv bei Windowsprogrammen


Magoo

Empfohlene Beiträge

Hi Leute!

Habe ein kleines Problem. Ich benutze den C++ Builder von Borland, um damit schicke Windows-Anwendungen zu programmieren. Das funktioniert bisher auch ganz gut.

Nur jetzt möchte ich ein Windows-Programm schreiben, das auch Parameter verarbeiten kann. Bei Konsolenanwendungen kein Problem. Aber jetzt kommts:

So sieht die vom Borland C++ Builder erstellte Main aus:


WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

{

      try

      {

             Application->Initialize();

             Application->CreateForm(__classid(TForm1), &Form1);

             Application->Run();

      }

      catch (Exception &exception)

      {

             Application->ShowException(&exception);

      }

      return 0;

}

Wie kann ich jetzt Parameterwerte übernehmen und benutzen, damit mein Programm verschiedene Sachen kann?

Ich stehe wie ein Ochs vorm Berg !!!

Danke schonmal für Antworten!

CU

Magoo

Link zu diesem Kommentar
Auf anderen Seiten teilen

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)

MST: Das 3. Argument sind die Parameter als eine Zeichenkette.

Crush-> Oder anders gesagt halt als String

MST: Das 4. Argument ist die Länge (inkl. schließender Null) der Zeichenkette

Crush-> Ist falsch, ein String selber terminiert sich durch die 0, also braucht man die Länge nicht zu kennen. Das sind die Anzahl der Argumente +1 (wegen dem Aufruf des Programms selbst, welches schon als Parameter zählt) nArgs soll normal "number of Arguments" als Anzahl der Argumente heißen.

also zum Besseren Verständnis

WINAPI WinMain(HINSTANCE, HINSTANCE,"Parameter1 Parameter2 Parameter3",4)

Ist vielleicht ein blödes Beispiel, aber dadurch wird klar, daß Das Programm selbst (Parameter1) und die 3 zusätzlichen Parameter als Zeichenkette/String die Anzahl der Parameter ergibt = 4

Du brauchst also nur 4-1=3x die Parameter bis zum nächsten Leerzeichen 0x20 oder Stringende 0x00 auseinanderschnippeln und kannst diese verarbeiten.

Jedenfalls, wenn das so bei Borland ist, denn die WinAPI WinMain() von Microsoft sieht ein wenig anders aus:

MSDN:

int WINAPI WinMain(

HINSTANCE hInstance, // handle to current instance

HINSTANCE hPrevInstance, // handle to previous instance

LPSTR lpCmdLine, // pointer to command line

int nCmdShow // show state of window

);

nCmdShow

Specifies how the window is to be shown. This parameter can be one of the following values: Value Meaning

SW_HIDE Hides the window and activates another window.

SW_MINIMIZE Minimizes the specified window and activates the top-level window in the system's list.

SW_RESTORE Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and position (same as SW_SHOWNORMAL).

SW_SHOW Activates a window and displays it in its current size and position.

SW_SHOWMAXIMIZED Activates a window and displays it as a maximized window.

SW_SHOWMINIMIZED Activates a window and displays it as an icon.

SW_SHOWMINNOACTIVE Displays a window as an icon. The active window remains active.

SW_SHOWNA Displays a window in its current state. The active window remains active.

SW_SHOWNOACTIVATE Displays a window in its most recent size and position. The active window remains active.

SW_SHOWNORMAL Activates and displays a window. If the window is minimized or maximized, the system restores it to its original size and position (same as SW_RESTORE).

Also schau nochmal zur Sicherheit genau nach, ob Borland´s WinMain nicht vielleicht auch auf diese Weise funktioniert.

<FONT COLOR="#a62a2a" SIZE="1">[ 05. November 2001 13:19: Beitrag 8 mal editiert, zuletzt von Crush ]</font>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Okay. So weit, so gut...

Aber:

Die oben abgebildete WinMain habe ich angepasst, und sieht jetzt so aus:


#include <vcl.h>

#pragma hdrstop

USERES("Auswertung.res");

USEFORM("Main.cpp", Form1);


WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR lpszArgs, int nArgs)

{

      try

      {

             Application->Initialize();

             Application->CreateForm(__classid(TForm1), &Form1);

             Application->Run();

      }

      catch (Exception &exception)

      {

             Application->ShowException(&exception);

      }

      return 0;

}

Jedoch werde ich nicht mehr in die Main coden. Der Rest befindet sich in der einer anderen Datei (in der Main.cpp).

Dort hab ich jetzt ne Funktion, in der ich die Parameter brauche. Wie komme ich da jetzt ran?

Ich hoffe, ihr habt das Problem verstanden.

Magoo

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also wichtig ist vorher erstmal:

#ifndef blockname oder auch if !define(Blockname)

#define Blockname

.... (ganzer Source folgen lassen)

#endif

(sollte eh immer überall im Header stehen,

damit nicht irgendwann alles doppeltgemoppelt reinincluded wird - gibt nur lauter errors im besten Fall)

Vielleicht solltest Du noch einen Namespace für das ganze Definieren, daß Du alle Variablen der CPP über Namespace::Funktion (Scope) ansprechen kannst.

Und wenn das ganze im Header von Main drin hast sollte auch schon das Meiste bekannt sein. Im Zweifelsfall kannst Du den String mit den Paramern ja auch über eine Funktion als Returnwert zurückgeben. Es ist ratsam den Argumentenstring nochmal extra in einen eigenen Pointer oder String im obigen Source irgendwo abzulegen, damit der Wert nicht nach dem Verlassen des Namespace verloren geht.

<FONT COLOR="#a62a2a" SIZE="1">[ 05. November 2001 21:14: Beitrag 3 mal editiert, zuletzt von Crush ]</font>

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hmm. Das hab ich auch nicht verstanden. Sorry! Bitte erklärt es mir auf etwas leichtere Art. Am Besten mit einem Beispiel.

Ich habe also eine Datei, in der die WinMain (programm.cpp) steht. Diese sieht wie folgt aus:


#include <vcl.h>

#pragma hdrstop

USERES("Auswertung.res");

USEFORM("Main.cpp", Form1);


WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR lpszArgs, int nArgs)

{

      try

      {

             Application->Initialize();

             Application->CreateForm(__classid(TForm1), &Form1);

             Application->Run();

      }

      catch (Exception &exception)

      {

             Application->ShowException(&exception);

      }

      return 0;

}

Dann habe ich noch eine weitere Datei. In dieser Habe ich dann auch noch Funktionen, wo ich in einer der Funktionen die Parameter verwenden möchte. Diese Funktion sieht bis jetzt so aus:

void __fastcall TForm1::FormActivate(TObject *Sender)

{

      int i = 0;      


      // Ein wenig Rechnerei


      // ...  usw.

}

Was muss ich jetzt machen, damit ich die Werte der Parameter in der Funktion "FormActivate" verwenden kann?

Wie gesagt. Antworten mit Beispielen würden mir am meisten helfen!

Danke schonmal

CU

Magoo

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...