Ĺadny brzuch
Potrzebuje funkcje ktora pozwoli mi odpalic exe'ka z argumentami spod kodu.
Tylko problem jest w tym jak przekazac argument z ktorym zostala uruchomiona glowna aplikacja i dodac 2 inne.
Dla zobrazowania sytuacji:
Odpalam moj program z parametrem:
MojProgram.exe c:\plik.txt
Oczywiscie string "c:\plik.txt" ladnie siedzi w argv[1].
Nastepnie chce wywolac inny program spod mojej aplikacji ale z parametrami w stylu:
InnyProgram.exe argv[1] d:\plik.txt e:\plik.txt
Znalazlem cos takiego:
system("JakisProgram.exe argumenty");
Problem w tym, ze wszystkie argumenty musza (z tego co doszedlem sam) byc pisane od poczatku, czyli:
system("JakisProgram.exe c:\\plik.txt d:\\plik.txt e:\\plik.txt")
Niestety triki w stylu:
system("JakisProgram.exe %s d:\\plik.txt e:\\plik.txt",argv[1])
Nie daja oczekiwanego rezultatu.
Dorwalem tez kod pod winapi (i by mi nawet bardziej pasowal) ale efekty parametrow sa takie same jak powyzej. (albo z tablicy argv albo na sztywno)
SHELLEXECUTEINFO ShExecInfo = {0}; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = NULL; ShExecInfo.lpFile = ""; <-exek ShExecInfo.lpParameters = ""; <-parametry ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_SHOW; ShExecInfo.hInstApp = NULL; ShellExecuteEx(&ShExecInfo); WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
Any idea?
polacz te argumenty w jeden string np. tym - strncat
i wtedy wywolaj system()
Użytkownik fernandez edytował ten post 22 listopad 2007, 00:57
Wygodniej pewnie będzie użyć sprintf'a. Choć niekoniecznie wydajniej (nie sprawdzałem co szybciej działa i jak jest różnica).
Użytkownik Ali240 edytował ten post 22 listopad 2007, 02:15
No ok, o tym tez pomyslalem, ale jak wywolac wyswietlenie sie stringa w funkcji system();
Ponadto musze tworzyc nowa tablice gdzie caly ciag sie musi zmiescic, a wezmy jeszcze pod uwage, ze string argv[1] moze byc baaardzo dlugi.
A jak by sobie poradzily z tym shellexecute albo createprocess?
Maja "lepiej" zalatwione podawanie parametrow?
No ok, o tym tez pomyslalem, ale jak wywolac wyswietlenie sie stringa w funkcji system();
Ponadto musze tworzyc nowa tablice gdzie caly ciag sie musi zmiescic, a wezmy jeszcze pod uwage, ze string argv[1] moze byc baaardzo dlugi.
A jak by sobie poradzily z tym shellexecute albo createprocess?
Maja "lepiej" zalatwione podawanie parametrow?
Przecież do system przekazuje się wskaźnik na tablicę charów - mylę się? Co do bardzo długiego ciągu - zrób sobie tablicę dynamiczną i przed skopiowaniem całości do niej ustaw jej odpowiedni rozmiar. A co do tworzenia nowej tablicy - już takie życie programisty c ;). A jakby była funkcja umożliwiająca taki zapis:
system("JakisProgram.exe %s d:\\plik.txt e:\\plik.txt",argv[1]);
to również została by utworzona nowa tablica tyle że wewnątrz tej funkcji ;).
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Tylko problem jest w tym jak przekazac argument z ktorym zostala uruchomiona glowna aplikacja i dodac 2 inne.
Dla zobrazowania sytuacji:
Odpalam moj program z parametrem:
MojProgram.exe c:\plik.txt
Oczywiscie string "c:\plik.txt" ladnie siedzi w argv[1].
Nastepnie chce wywolac inny program spod mojej aplikacji ale z parametrami w stylu:
InnyProgram.exe argv[1] d:\plik.txt e:\plik.txt
Znalazlem cos takiego:
system("JakisProgram.exe argumenty");
Problem w tym, ze wszystkie argumenty musza (z tego co doszedlem sam) byc pisane od poczatku, czyli:
system("JakisProgram.exe c:\\plik.txt d:\\plik.txt e:\\plik.txt")
Niestety triki w stylu:
system("JakisProgram.exe %s d:\\plik.txt e:\\plik.txt",argv[1])
Nie daja oczekiwanego rezultatu.
Dorwalem tez kod pod winapi (i by mi nawet bardziej pasowal) ale efekty parametrow sa takie same jak powyzej. (albo z tablicy argv albo na sztywno)
SHELLEXECUTEINFO ShExecInfo = {0}; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = NULL; ShExecInfo.lpFile = ""; <-exek ShExecInfo.lpParameters = ""; <-parametry ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_SHOW; ShExecInfo.hInstApp = NULL; ShellExecuteEx(&ShExecInfo); WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
Any idea?
polacz te argumenty w jeden string np. tym - strncat
i wtedy wywolaj system()
Użytkownik fernandez edytował ten post 22 listopad 2007, 00:57
Wygodniej pewnie będzie użyć sprintf'a. Choć niekoniecznie wydajniej (nie sprawdzałem co szybciej działa i jak jest różnica).
Użytkownik Ali240 edytował ten post 22 listopad 2007, 02:15
No ok, o tym tez pomyslalem, ale jak wywolac wyswietlenie sie stringa w funkcji system();
Ponadto musze tworzyc nowa tablice gdzie caly ciag sie musi zmiescic, a wezmy jeszcze pod uwage, ze string argv[1] moze byc baaardzo dlugi.
A jak by sobie poradzily z tym shellexecute albo createprocess?
Maja "lepiej" zalatwione podawanie parametrow?
No ok, o tym tez pomyslalem, ale jak wywolac wyswietlenie sie stringa w funkcji system();
Ponadto musze tworzyc nowa tablice gdzie caly ciag sie musi zmiescic, a wezmy jeszcze pod uwage, ze string argv[1] moze byc baaardzo dlugi.
A jak by sobie poradzily z tym shellexecute albo createprocess?
Maja "lepiej" zalatwione podawanie parametrow?
Przecież do system przekazuje się wskaźnik na tablicę charów - mylę się? Co do bardzo długiego ciągu - zrób sobie tablicę dynamiczną i przed skopiowaniem całości do niej ustaw jej odpowiedni rozmiar. A co do tworzenia nowej tablicy - już takie życie programisty c ;). A jakby była funkcja umożliwiająca taki zapis:
system("JakisProgram.exe %s d:\\plik.txt e:\\plik.txt",argv[1]);
to również została by utworzona nowa tablica tyle że wewnątrz tej funkcji ;).