Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Borland C++ Builder » Programmstart beim zeitenmal Verhindern!!!

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
19.04.2005, 09:13 Uhr
ARM-Tec



Hallo Leute,

wer weiß wie ich das löse?

Habe vor längerer Zeit einen Code Teil gefunden der einen zweiten Programmstart verhindern soll. Nur kann ich mit diesen Infos noch nichts anfangen.

Mein Projekt heißt "History" und ich habe diese Zeilen wie beschrieben in die Projektdatei eingebunden, aber irgend wie will das nicht gehen. Was mach ich den falsch?

Ich glaube der Tipp damals kam von Bruder Leif. Kannst Du mir vieleicht helfen?

Ich benutze dieses Programm in einem Netzwerk. Würde gerne verhindern, dass mehrere Leute das Programm starten können und einzelne Dokumente bearbeiten.

Den damals gefundenen Code habe ich wie folgt eingebunden:

____________
Histopry.cpp

C++:

/ ********* Programm start beim Zweiten mal verhindern. **********
in der CPP Projekt Datei kopieren, vor die Stelle in der das Application-Objekt instantiiert wird, und fertig... */

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{

        try
        {
        if(FindWindow(NULL, "Sander History"))
          {
          //Programm wurde schon gestartet
          return 0;
          }
                 Application->Initialize();
                 Application->CreateForm(__classid(TForm1), &Form1);
                 Application->CreateForm(__classid(TForm2), &Form2);
                 Application->CreateForm(__classid(TForm3), &Form3);
                 Application->CreateForm(__classid(TForm5), &Form5);
                 Application->CreateForm(__classid(TForm4), &Form4);
                 Application->Run();
        }
        catch (Exception &exception)
        {

                 Application->ShowException(&exception);
        }
        return 0;
}


________


Also ich denke der eine oder andere kann mir helfen im voraus mal Danke.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
19.04.2005, 10:27 Uhr
mmc20
puss in boots


hallo,
also der code bezieht sich darauf den mehrfachstart auf einem pc zu verhindern, wenn du aber im netzwerk arbeitest funktioniert das so nicht.
was mir da spontan einfällt: einfach die documente so öffnen das kein anderer im netzwerk darauf zugreifen kann.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
19.04.2005, 15:04 Uhr
ARM-Tec



Hallo Leute,

hab das Problem, wenn auch nicht schön anderst gelöst.
_______
History

C++:
/*
   Ueberpruefen ob Programm schon mal gestartet wurde
   Wurde das Programm schon gestartet wurde auch eine
   Datei mit dem Namen "tmp" im Verzeichnis "SANDER HISTORY"
   angelegt. Dadurch wird ein"Zweiter Start" des Programmes nicht möglich.
   Es kann also keine Historie in "zweiter Instanz" veraendert werden.
*/


AnsiString asFileName = FileSearch("tmp" , GetCurrentDir());
if ( ! (asFileName == "tmp") )
  {
  // Handle erstellen, Datei anlegen und schließen.
  int iFileHandle;
  iFileHandle = FileCreate("tmp");
  // Datei schließen damit sie wieder gelöscht werden kann
  FileClose(iFileHandle);
  }
else
  {
  Application->MessageBox("Programm kann nicht gestartet werden.  Es wird schon durch einen anderen Bediener genutzt!!! ", "Hinweis", MB_OK);
  return 0;
  }
        try
          {
                 Application->Initialize();
                 Application->CreateForm(__classid(TForm1), &Form1);






Beim Verlassen des Programmes Wird die Datei tmp wieder gelöscht. Somit funzt es auch im Netzwerk.

Die erste Version mit "FindWindow" hat aber trotzdem nicht geklappt, auch nicht wenn es nur auf dem Rechner gestartet wurde, warum???
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
19.04.2005, 16:10 Uhr
Th



Du mußt sicherstellen, daß der String in FindWindow (bei dir "Sander History") auch der Eigenschaft "Caption" des Hauptformulars entspricht (also des Fensters, daß dauernd angezeigt wird).

Eine bessere Lösung ist mittels eines Mutex zu arbeiten:


C++:
#ifndef LimitSingleInstance_H
#define LimitSingleInstance_H

//! Application Singleton
/*!this code is from Q243953 in case you lose the article and wonder
* where this code came from...
*/

class CLimitSingleInstance
{
protected:
  DWORD  m_dwLastError;
  HANDLE m_hMutex;

public:
  /// construktor
  /*!
    be sure to use a name that is unique for this application otherwise
    two apps may think they are the same if they are using same name for
    3rd parm to CreateMutex
    */

  CLimitSingleInstance(TCHAR *strMutexName)
  {
    m_hMutex = CreateMutex(NULL, FALSE, strMutexName); //do early
    m_dwLastError = GetLastError(); //save for use later...
  }
  
  ~CLimitSingleInstance()
  {
    if (m_hMutex)  //don't forget to close handles...
    {
       CloseHandle(m_hMutex); //do as late as possible
       m_hMutex = NULL; //good habit to be in
    }
  }

  /// check if another instance is still open
  BOOL IsAnotherInstanceRunning()
  {
    return (ERROR_ALREADY_EXISTS == m_dwLastError);
  }
};
#endif



Aufruf dann mit:

C++:
CLimitSingleInstance SingleInstanceObj(TEXT("EINDEUTIGER PROGRAMMNAME"));
if (SingleInstanceObj.IsAnotherInstanceRunning())
{
    MessageBox(0,"Das Programm läuft bereits! Beenden Sie die andere Instanz. Das Programm kann nur einmal gleichzeitig gestartet werden.","Fehler",MB_OK);
    return 0;
}




Nochwas zu deinem Netzwerk-Code:

Wenn du das gleiche Programm von verschiedenen Rechnern aus startest, so ist "GetCurrentDir" aber jedesmal unterschiedlich, so daß dies auch nicht funktionieren kann.

Dies kannst du nur verhindern, wenn du einen absoluten (Netzwerk-)Pfad in deinem Programm überprüfst.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
19.04.2005, 16:44 Uhr
~ARM-Tec
Gast


Hallo Th,

Danke, gute Lösung, ist auch möglich. Aber mein Caption von diesem Formular ist "Sander History". Warum geht es trotzdem nicht???

Es ist nicht alles Glas hinwo man durch schaut. Auch für mich.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ Borland C++ Builder ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: