PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C - Mehrfache Programmausführung verhindern



f!l3st0rm
20.10.2008, 22:27
Plattform: Windows NT
Prozessor: Intel x86


Wie kann ich mit native C realisieren, dass ein Programm welches bereits gestartet wurde beim nächsten Doppelklick nicht nochmals geladen wird.

----------
Beispiel Szenario:

programm.exe -> klick -> gestartet
programm.exe -> klick -> nochmal gestartet
(jetzt würde alles doppelt gemacht.)
----------

Hab bereits etwas gesucht (Mutex, WinAPI), bin mir aber unsicher wie dies jetzt in C implementiert wird.

Vielleicht kennt Ihr ne gute Referenz/Tutoriell oder habt ein passendes Codeschnipsel?

YannicK
20.10.2008, 22:31
ich hab nich soviuel ahnung von c++ also wie der codeschnippsel aussehen würde

aber überprüf doch einfach in den prozessen ob der prozess von deinem programm schon läuft ;p

f!l3st0rm
20.10.2008, 22:33
Naja, ist aber die PID, der Prozessname ist nicht eindeutig.

Planxty
20.10.2008, 22:35
aber überprüf doch einfach in den prozessen ob der prozess von deinem programm schon läuft ;p

also ich beziehe es mal auf batch stell dir die vor:


:1
tskill prog.exe
goto1


das würde den pc im hintergrund etwas aufhalten könnte ich mir vorstellen ^^

YannicK
20.10.2008, 22:40
aber überprüf doch einfach in den prozessen ob der prozess von deinem programm schon läuft ;p

also ich beziehe es mal auf batch stell dir die vor:


:1
tskill prog.exe
goto1


das würde den pc im hintergrund etwas aufhalten könnte ich mir vorstellen ^^

Das würde doch nur das programm schliesen und wieder öffnen wens existiert? xD ist doch doof :<

Also halt schauen ob der prozess läuft o_O und dan den code nicht ausführen

f!l3st0rm
20.10.2008, 22:42
Ok, ich glaub Ihr versteht micht nicht ganz. Ich versuchs nochmal:

Das Programm "programm.exe" wird gestartet. So, jetzt läuft's.
Kommt jetzt jemans ausversehen oder warum auch immer nochmal auf die Idee programm.exe ein zweites mal zu starten, dann soll das Programm selbst erkenne, das es bereits läuft und sich beenden. Dazu wird kein tskill benötigt, sondern nur eine Prozedur/Methode welche checked, ob das Programm schon läuft - wenn ja:

return 111;

Nun, wie das mit Serialisation oder obs ne WinAPI Funktion (Windows = Nachrichtenbasiertes System - evtl. Nachricht an alle Prozesse mit Namen programm.exe - bist Du auch ich (dieses programm.exe)?) würd ich gern wissen.

Ich schreib schonma nen Beispielprogramm, wo der entscheidende Teil eben fehlt:



#include <stdio.h>

int main () {

// läuft bereits eine Instanz von exakt diesem Programm
// Programmnamen können ja mehrmals vorkommen (svchost.exe)

if (INSTANZ) {
return 111; // Ja, es gibt bereits ne Instanz
}

// ansonsten hier der Code der ausgeführt wird, wenn es das erste mal gestartet wird.


return 0;
}

Planxty
20.10.2008, 22:43
oh sry stimm iwie schlafe ich wohhl schon halb^^ das prog darf ja einmal laufen^^
ui ich hab nix gesagt :-[

YannicK
20.10.2008, 22:47
10sekunden google


//---------------------------------------------------------------------------
void TForm1::GetProcessNames(TStrings* AList,DWORD ID)
{
if(AList)
{
char szProcessName[MAX_PATH] = "unknown";
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |PROCESS_VM_READ,FALSE,ID);
if(hProcess)
{
HMODULE hMod;
DWORD cbNeeded;
if (EnumProcessModules( hProcess, &hMod, sizeof(hMod),&cbNeeded) )
GetModuleBaseName( hProcess, hMod, szProcessName,sizeof(szProcessName) );
}
AList->Add(String(szProcessName));
CloseHandle(hProcess);
}
}

//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
RichEdit1->Lines->Clear();
DWORD Processes[1024],size,count;
if (EnumProcesses(Processes,sizeof(Processes),&size))
for (int i=0;i<int(size/sizeof(DWORD));i++)
GetProcessNames(RichEdit1->Lines,Processes[i]);
}
//---------------------------------------------------------------------------

Quelle:

http://www.c-plusplus.de/forum/viewtopic-var-p-is-65076.html

f!l3st0rm
20.10.2008, 22:48
Werd ich testen ...

Gibt 1. Problem: C++

Ich muss sagen, dass ich dringend an einer native C Lösung interessiert bin.
Ich komm mit C++ nicht klar (besonders da ich bei msdn keine ALternative für C gefunden habe). Da muss es doch auch iwas geben?

Cyberhood
21.10.2008, 01:55
Vielleicht einfach nen Reg eintrag anlegen und am Anfang auslesen , wenn er da ist. Programm beenden , wenn nicht fortfahren.

hateme666
21.10.2008, 06:38
über die WinAPI wird das wohl gehen musste maul google un halt winapi noch mit dranhängen hinten....und winapi is ja pures c...

YannicK
21.10.2008, 06:43
Vielleicht einfach nen Reg eintrag anlegen und am Anfang auslesen , wenn er da ist. Programm beenden , wenn nicht fortfahren.

ist keine gute idee was ist wen das programm über den taskmanager geschlossen wird?
oder ein kritikal error entsteht und das programm abstürzt? ;)

th3flood
21.10.2008, 12:45
Hast du schonmal zb in der MSDN nachgesehen? Dort wird doch erklärt, wie man die Mutex-Funktion verwendet.

l0dsb
21.10.2008, 13:52
Wenn du doch schon bei der MSDN (http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx) warst, wieso hast du den Text nicht mal gelesen? ;)


If the function fails, the return value is NULL. To get extended error information, call GetLastError.

f!l3st0rm
21.10.2008, 16:45
Danke, der Link von SmartFrame hilft - jup ich war auf msdn, doch auf einer Seite wo die Funktion für C++, JS, VB und c# erklärt wurde, nur seltsam dass ich das nicht gefunden habe. Also ich werd nun weiterschreiben.

Wenn jemandem noch ne Möglichkeit einfällt wie die Aufgabenstellung zu lösen sit - immer gern.

(Meine ursprüngliche Idee war: alle Prozesse mit dem Namen programm.exe auslesen und schauen ob der Pfad auch derselbe wie bei programm.exe ist)


...

#include <stdio.h>
#include <windows.h>

int main () {

CreateMutex(0, FALSE, "-1-" /* eindeutige id */);

if (ERROR_ALREADY_EXISTS == GetLastError()) {
return 0; // beenden
}

// weiter


return 0;
}