"We are back" « oc.at

[C] Externes Programm aufrufen (Windows)

jives 07.07.2006 - 10:46 942 5
Posts

jives

And the science gets done
Avatar
Registered: Sep 2001
Location: Baden
Posts: 3548
Ich schreibe (oder versuche ;)) gerade ein CLI-Programm in C, welches alle x Minuten (implementiert mit Sleep(x)) ein File auswerten und je nachdem was in dem File steht ein externes Programm (ebenfalls CLI und C) mit Argumenten aufrufen soll.

Für Testzwecke habe ich folgendes Programm geschrieben, dass einfach nur die ihm übergebenen Kommandozeilenparamter zurückgibt
Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  long i = 0;
  
  system("cls");
  printf("Argument Test v1.0\n\n");
  
  for (i = 0; i < argc; i++)
  {
      printf("> %ld: %s\n", i, argv[i]);
  }
  
  printf("\nDone.\n");
  return 0;
}
Im Hauptprogramm wird das obere Programm mit execl/execv aufgerufen und zwar folgendermaßen
Code:
const char execpath[] = "..\\ArgTest\\ArgTest.exe";
const char argument[] = "arg1";
...
execl(execpath, argument, (char *)0);
Das funktioniert auch, nur leider steht in argv[0] das Argument - und nicht der Programmname - und ich komme nicht mehr ins Hauptprogramm zurück. Mein Testprogramm wird auch nicht beendet.
Scheinbar wird das aber Hauptprogramm beendet, denn mit
Code:
execl("C:\\Windows\\system32\\taskmgr.exe", (char *)0);
wird der Taskmanager aufgerufen, das Hauptprogramm steht aber.

So weit ich http://www.opengroup.org/onlinepubs...tions/exec.html verstanden habe, wird mit execl der aktuelle Prozess einfach überlagert - liegt darin der Fehler? Muss ich einen eigenen, unabhängigen Prozess starten? Wenn ja - wie kann ich das bewerkstelligen?

tia :)
Bearbeitet von jives am 07.07.2006, 11:09

Darius

 Guru
Avatar
Registered: Dec 2001
Location: Vienna
Posts: 2069
ich bin leider kein guter coder...kann ein bisschen schul C...ist jetzt zwar extrem Russisch...aber du könntest die Programme die du aufrufen willst in die Windows System32 kopieren und dann mit system("XXX"); aurufen...kA obs geht...wilde blöde idee ;)

jives

And the science gets done
Avatar
Registered: Sep 2001
Location: Baden
Posts: 3548
Das funktioniert :)
Wäre aber nur eine Notlösung, da das Programm, das aich aufrufen will, eigentlich auf einer zentralen Stelle liegen sollte...

Thx auf jeden Fall.

jives

And the science gets done
Avatar
Registered: Sep 2001
Location: Baden
Posts: 3548
Hat sich erledigt, system() kann auch Programme ausführen die nicht in system32 liegen, man muss nur den Pfad angeben :D

Darius

 Guru
Avatar
Registered: Dec 2001
Location: Vienna
Posts: 2069
oh cool gut zu wissen :)

Luzandro

Here to stay
Avatar
Registered: Mar 2006
Location: 2482
Posts: 708
Zitat von jives
So weit ich http://www.opengroup.org/onlinepubs...tions/exec.html verstanden habe, wird mit execl der aktuelle Prozess einfach überlagert - liegt darin der Fehler? Muss ich einen eigenen, unabhängigen Prozess starten? Wenn ja - wie kann ich das bewerkstelligen?

du müsstest zuerst ein fork() aufrufen und im kindprozess das exec - kommt aber aufs gleiche raus
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz