Programm nicht zweimal öffnen

hoizfuchs

Grünschnabel
Hallo leute,

habe folgendes Problem:

habe ein c++ programm vor mir, dass mit dem namen "project2" auf dem Desktop geladen ist. Ein weiteres Assemblerprogramm ist auf einem Controllerboard gebrannt und über RS232 mit dem PC (C++) verbunden. Wenn nun das C++ Programm geöffnet ist und läuft, und man dann nochmal das Programm ein zweites Mal aufmacht, dann kommt die Fehlermeldung "Das Handle ist ungültig" Unsere Vermutung ist, dass dies mit der Schnittstelle zu tun hat, die gesucht wird, aber bereits in Gebrauch ist. Die Fehlermeldung "Das Handle ist ungültig" kommt dann jede Sekunde einmal bis das Desktop voll ist und man wird gezwungen, den PC herunterzufahren weil er total hängt.................
Nun wäre eine Einstellung ohne Eingriff ins C++ sehr elegant, welche man unter Windows einstellen könnte, oder einfach irgendwas, dass das Programm kein zweites Mal gestartet werden darf, wenn es bereits offen ist.

Würde mich ein beachtliches Stück weiterbringen, da das Bedienpersonal der Prüfanlage diesen Fehler sehr oft macht (besonders bei vorheriger Minimierung des Programms) und die Daten von 3h immer verloren sind.


Mit freundlichen Grüßen
 
Hallo,

habe ein c++ programm vor mir, dass mit dem namen "project2" auf dem Desktop geladen ist.
Auf dem Desktop geladen? Du meinst wohl eine Verknüpfung, oder?

Mir fällt momentan überhaupt nichts ein, dieses "Problem" zu lösen, ohne etwas programmiertechnisch zu machen. Man muss ja nicht unbedingt den Hauptcode (C++) ändern, sondern man kann ein "Zusatzprogrämmchen" machen.
 
Ich denke nicht das Windows überwachen kann ob ein Programm bereits gestartet ist oder nicht.

Auch wenn es keine 100% Lösung für das Problem ist, so würde ich einfach das Programm/die Verknüpfung vom Desktop löschen und dafür einen Eintrag im Autostart machen.
So wie ich dich verstehe ist das Programm ja eh immer im Einsatz, dann kann es auch beim Start von Windwos automatisch geladen werden.
 
Moin,

Ich denke nicht das Windows überwachen kann ob ein Programm bereits gestartet ist oder nicht.

also eine Windows-Einstellung für das Problem kenne ich auch nicht, aber wir prüfen hier in einem unserer Tools über die Prozessliste, ob eine bestimme Anwendung läuft :
C++:
/*****************************************************************************
 *	FUNCTION    : bool CTobitTemplateParser::isServiceLayerRunning()         * 
 *---------------------------------------------------------------------------*
 *	DESCRIPTION : Überprüfung ob der ServiceLayer "sl.exe"  läuft   *
 *	                                                                         *
 *	ARGUMENT    : None                                                       *
 *	RETURN      : ja / nein                                                  *
 *****************************************************************************/
bool CTobitTemplateParser::isServiceLayerRunning()
{
	HANDLE hSnapShot;
	PROCESSENTRY32 pEntry;

	bool bRes = false;

	hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hSnapShot == INVALID_HANDLE_VALUE)
    {
        TRACE("CreateToolhelp32Snapshot (of processes)");
        return (bRes);
    }

	pEntry.dwSize = sizeof(pEntry);

	while (1)
	{
		BOOL hRes = Process32Next( hSnapShot, &pEntry );
		
		if( hRes == FALSE )
			break;

		if( _strnicmp(pEntry.szExeFile, "sl.exe", strlen("sl.exe")) == 0 )
		{
			bRes = true;
			break;
		}
	}
	return bRes;
}

Ist ja als Anregung vlt. ganz hilfreich :)

Gruß
Klaus
 
Zuletzt bearbeitet von einem Moderator:
@vfl_freak: Es soll ja keine Eingriff in den Hauptcode erfolgen.
Ich dachte mir, man schreibt ein kleines Batchprogramm. Auf dem Desktop ist eine Verknüpfung zu dieser Batch.
Und diese Batch ruft das Programm auf, und verändert irgendwie die Verknüpfung (vllt. anderes Icon).
 
Zurück