Announcement

Collapse
No announcement yet.

C++Builder - Anwendung nur einmal sterten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • C++Builder - Anwendung nur einmal sterten

    <html>

    <head>
    <meta http-equiv="Content-Type"
    content="text/html; charset=iso-8859-1">
    <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
    <title>Vorgehensweise bei der technischen Prüfung oder Zeichnungserstellung:</title>
    </head>

    <body bgcolor="#FFFFFF">

    <p>Hallo, ich habe da ein Problem. Mein Programm darf nur einmal
    gestartet werden. Deshalb hab ich aus dem Buch <em><strong>C++Builder
    im Team</strong></em> den nachstehenden Code übernommen.
    Funktioniert wunderbar, bis auf einen Schönheitsfehler: Es gibt
    einen Unterschied, ob das Programm aus einer Application via
    WinExec oder ShellExecute aufgerufen, oder ob es im
    Windows-Startmenü angeklickt wurde! Also, ich kann mein Programm
    einmal im Startmenü anwählen. Beim zweitenmal funktioniert der
    Code. Wenn ich es nun zusätzlich via ShellExecute starte, habe
    ich zwei Instanzen! Beim zweiten ShellExecute kommt aber keine
    dritte Instanz. Umgekehrt, wenn ich zuerst via ShellExecute
    starte, kann ich das Programm aus dem Startmenü auch noch
    aufrufen. Wie kommt das ? Danke - Günther</p>

    <pre>
    <strong>char</strong> *<font color="#0000FF"><strong>GetPrevInstMutexName</strong></font>(<strong>void</strong>)
    {
    <strong>char</strong> *WindowBuf=(<strong>char</strong> *) <font
    color="#0000FF">malloc</font>(MAX_PATH);
    <strong>char</strong> *s=(<strong>char</strong> *) <font
    color="#0000FF">malloc</font>(MAX_PATH);
    <font color="#0000FF">GetWindowText</font>(Application-&gt;Handle,WindowBuf,MAX_PATH);
    <font color="#0000FF">strcpy</font>(s,&quot; PREVINST: &quot;
    <font color="#0000FF">strcat</font>(s,WindowBuf);
    <strong>return</strong>(s);
    }

    WINAPI <font color="#0000FF"><strong>WinMain</strong></font>(HINSTANCE, HINSTANCE HI, LPSTR, <strong>int</strong>)
    {
    <strong>int</strong> Mutex=(<strong>int</strong>)<font
    color="#0000FF">CreateMutex</font>(NULL,true,<font
    color="#0000FF"><strong>GetPrevInstMutexName</strong></font>());
    <strong>if</strong>((Mutex!=NULL) &amp;&amp; (<font
    color="#0000FF">GetLastError</font>()==0))
    {
    // <font color="#008000"><strong>normale Programmausführung</strong></font>
    }
    <strong>else</strong>
    {
    // <font color="#008000"><strong>Programm läuft bereits</strong></font>
    }
    }
    </pre>
    </body>
    </html>
    Günther

  • #2
    Hi!!

    wenn ich meinem Programm nur erlaube 1mal aktiv zu sein, schreibe ich immer in die cpp des Projekts:

    WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
    {
    // Prüft, ob das Fenster schon vorhanden ist
    if (FindWindow(NULL, "Mehrfaches ausfuehren") != NULL)
    {
    MessageBox(0, "Mehrfaches ausführen nicht möglich", "Programmmeldung", MB_OK + MB_ICONEXCLAMATION);
    }
    else // Wenn nicht, dann starte die Anwendung
    {
    try
    {
    Application->Initialize();
    Application->CreateForm(__classid(TForm1), &Form1);
    Application->Run();
    }
    catch (Exception &exception)
    {
    Application->ShowException(&exception);
    }
    }
    return 0;
    }

    In diesem Beispiel ist dann Form1->Caption = Mehrfaches ausfuehren; Nur das du bescheid weißt.

    Ich hoffe ich habe dir weitergeholfen.

    Philip

    Comment


    • #3
      Hallo Philipp,

      wenn ich es richtig sehe, funktioniert das ganze nur, wenn ich den Fenster-Titel meines Programmes kenne.<br>
      Aber was kann ich machen, wenn sich dieser ändert (abhängig vom angezeigten Fensterinhalt oder der geladenen Datei)?

      Shalom,<br>
      <dir>Klaus

      P.S.: Wenn du den Source-Code zwischen die Tags <pre> ... </pre> setzt, werden auch die Zeilenumbrüche übernommen. Dadurch kann man den Code wesentlich einfacher lesen

      Comment


      • #4
        Hallo Philipp,

        wenn ich es richtig sehe, funktioniert das ganze nur, wenn ich den Fenster-Titel meines Programmes kenne.<br>
        Aber was kann ich machen, wenn sich dieser ändert (abhängig vom angezeigten Fensterinhalt oder der geladenen Datei)?

        Shalom,<br>
        <dir>Klaus</dir>

        P.S.: Wenn du den Source-Code zwischen die Tags &lt;pre&gt; ... &lt;/pre&gt; setzt, werden auch die Zeilenumbrüche übernommen. Dadurch kann man den Code wesentlich einfacher lesen

        Comment


        • #5
          <html>

          <head>
          <meta http-equiv="Content-Type"
          content="text/html; charset=iso-8859-1">
          <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
          <title>Normale Seite ohne Titel</title>
          </head>

          <body bgcolor="#FFFFFF">

          <p><font size="2">Hallo Phillip, das ist ja eine Super Idee,
          wieso bin ich da nicht selbst drauf gekommen ? Wo ich doch im
          else-Zweig schon genau dieses FindWindow anwende, um der
          laufenden Instanz via PostMessage das Vorhandensein eventueller
          Aufrufparameter mitzuteilen !</font></p>

          <p><font size="2">Hallo Klaus, in diesem Fall ist der
          Fenster-Titel immer gleich. Ich kann aber auch den ClassNamen
          verwenden, wenn ich den kenne:<strong>
          FindWindow(&quot;ClassName&quot;,NULL); </strong>.Bei einer
          BCB-Anwendung ist der aber nicht so einfach festzulegen, - wenn
          ich richtig beobachtet habe - wird <strong>&quot;TApplication&quot;
          </strong>vorgegeben. Bei einem normalen Windowsprogramm hat man
          das mit <strong>wc.lpszClassName</strong> bei der
          Fensterinitialisierung selbst in der Hand. Wenn beides unbekannt
          oder variabel ist, muß man mit <strong>EnumWindows</strong>
          arbeiten, dazu hatte mir Andreas im Forum3 Hilfestellung
          geleistet. Ich hab aber die betreffenden Programme noch nicht auf
          Stand gebracht, hier die Test-Variante. Dabei handelt es sich um
          das CAD-Programm ME10 von CoCreate , das in der Version 8.7 - die
          wir zur Zeit noch einsetzen - sowohl über den ClassName als auch
          über den Titel ausfindig gemacht werden kann. Ab der Version 9.0
          befindet sich im Fenstertitel zusätzlich der Dateiname der
          Zeichnung, und der ClassName ist nicht nur anders, sondern auch
          noch variabel. Das </font><font color="#FF0000" size="2"><strong>hwnd</strong></font><font
          size="2"> ist der Schlüssel, den man zur weiteren Verarbeitung
          benötigt.</font></p>

          <pre>
          BOOL CALLBACK MyEnumWindowsProc(HWND <font color="#FF0000"><strong>hwnd</strong></font>,LPARAM lParam)
          {
          BOOL ret=<strong>true</strong>;
          LPSTR Text=<strong>new</strong> <strong>char</strong>[80];
          GetWindowText(<font color="#FF0000"><strong>hwnd</strong></font>,Text,78);
          <strong>if</strong>(strstr(Text,&quot;CoCreate&quot!=NULL)
          {
          <strong>if</strong>(MessageBox(NULL,&quot;weiter ?&quot;,Text,MB_YESNO)==IDNO) ret=<strong>false</strong>;
          }
          <strong>delete</strong> Text;
          <strong>return</strong> ret;
          }

          <strong>void</strong> <strong>__fastcall</strong> TForm1::EnumWindows1Click(TObject *Sender)
          {
          <strong>if</strong>(EnumWindows((FARPROC)MyEnumWindowsProc,(LP ARAM)0L))
          MessageBox(Handle,&quot;nicht gefunden&quot;,&quot;&quot;,MB_OK);
          <strong>else</strong> MessageBox(Handle,&quot;gefunden&quot;,&quot;&quot ;,MB_OK);
          }
          </pre>

          <p><font size="2">Gruß: Günther</font></p>

          <p>&nbsp;</p>
          </body>
          </html&gt
          Günther

          Comment


          • #6
            Klappt soweit ganz gut, mit dem Vorschlag von Phillip. Ich muß nur in Form->Create einen anderen Fenstertitel zuweisen und diesen Titel abfragen. Windows legt wohl vor der Programm-Initialisierung eine Art Dummy-Fenster an!

            Neues Problem: Wenn ich jetzt mein Programm ein paar mal von den verschiedenen Stellen aus zu starten versucht habe, läßt sich das Fenster nicht mehr zum Symbol verkleinern. Maximize und zurück geht noch. Hat jemand eine Idee
            Günther

            Comment

            Working...
            X