Κλήση/ενσωμάτωση προγραμμάτων
Κλήση/ενσωμάτωση προγραμμάτων
Καλησπέρα...
Είναι δυνατόν στο πρόγραμμα που γράφεις να συμπεριλάβεις κατάλληλες εντολες ώστε σε κάποιο σημείο του να εκτελείται ενα άλλο(εμπορικό) πρόγραμμα και να μπορείς να δώσεις επίσης παραμέτρους,settings, κτλ του προγράμματος αυτού?
ή
να ελέγξεις συγκεκριμένες λειτουργίες μιας σελίδας(συγκεκριμένα buttons).
Είναι δυνατόν στο πρόγραμμα που γράφεις να συμπεριλάβεις κατάλληλες εντολες ώστε σε κάποιο σημείο του να εκτελείται ενα άλλο(εμπορικό) πρόγραμμα και να μπορείς να δώσεις επίσης παραμέτρους,settings, κτλ του προγράμματος αυτού?
ή
να ελέγξεις συγκεκριμένες λειτουργίες μιας σελίδας(συγκεκριμένα buttons).
- HdkiLLeR
- Venus Project Founder
- Posts: 4356
- Joined: Tue Jan 27, 2004 4:41 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: New York, NY
- Contact:
Σε όλες τις γλώσσες προγραμματισμού (ακόμη και σε scripting) μπορείς να καλείς άλλα executables και να περάσεις παραμέτρους σε αυτά. Τώρα ειδικότερα για το πως μπορείς να κάνεις handle μέσα απο μια εφαρμογή μια άλλη είναι λίγο πιο advanced θέμα και θέλει συζήτηση.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
- netharis
- Venus Former Team Member
- Posts: 1845
- Joined: Sun Jul 15, 2007 2:37 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Seattle, Washington
- Contact:
σε C++ για να καλέσω κάτι εγώ χρησιμοποιώ:
καλύτερα να βάλεις το executable μέσα στο system32 για να το καλείς απο παντού.
Τώρα για να κάνεις δυναμική εκχώρηση στο system ( αφού είναι const char) :
π.χ θες να του θέσεις εσύ απο input το πρόγραμμα και τις παραμέτρους
Δεν ξέρω σε ποιά γλώσσα ή πλατφόρμα δουλεύεις αλλά αυτή είναι η γενική ιδέα.
Code: Select all
system("application.exe -p");
Τώρα για να κάνεις δυναμική εκχώρηση στο system ( αφού είναι const char) :
π.χ θες να του θέσεις εσύ απο input το πρόγραμμα και τις παραμέτρους
Code: Select all
string InputCommand;
cin >> InputCommand;
const char* command = InputCommand.c_str ();
system(command);
Resistance is futile. Join the foss-side now!
"UNIX is very simple, it just needs a genius to understand its simplicity." - Dennis Ritchie
"The things that I want, by Max Payne. A smoke. A whiskey. For the sun to shine. I want to sleep, to forget. To change the past. Unlimited ammo and a license to kill. But right then, more than anything, I wanted her."
- HdkiLLeR
- Venus Project Founder
- Posts: 4356
- Joined: Tue Jan 27, 2004 4:41 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: New York, NY
- Contact:
Δεν είναι ανάγκη να είναι στο system32 των windows (μάλιστα είναι κακό practice αυτό). Τρέχοντας την system() θα κοιτάξει εάν το application.exe βρίσκεται στο current path και εάν το βρεί θα το εκτελέσει. Διαφορετικά θα κοιτάξει σε κάθε directory που βρίσκεται στο environment variable: PATH. Τώρα σχετικά με την system() απλά εκτελεί το executable με τα ορίσματα του. Εαν ενδιαφέρεσαι ή θέλεις περισσότερο advanced έλεγχο στο τι θα περάσεις στο application που θα καλέσεις πρέπει να κοιτάξεις την οικογένεια exec: http://www.opengroup.org/onlinepubs/000 ... /exec.htmlnetharis wrote:σε C++ για να καλέσω κάτι εγώ χρησιμοποιώ:καλύτερα να βάλεις το executable μέσα στο system32 για να το καλείς απο παντού.Code: Select all
system("application.exe -p");
Πχ μπορεί να θέλεις να καλέσεις ένα executable με συγκεκριμένο environment (συγκεκριμένα environment variables, arguments κλπ κλπ).
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
- netharis
- Venus Former Team Member
- Posts: 1845
- Joined: Sun Jul 15, 2007 2:37 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Seattle, Washington
- Contact:
Δηλαδή σε windows, για να τρέξω κάτι χωρίς το exec, μέσα απο το system χωρίς να έχω στο system32 το exe,
πρέπει να δηλώσω μια environment variable έτσι;
Δεν το είχα σκεφτεί ποτέ (όντως δεν είναι λογικό να αντιγράφω κάθε exe μέσα στο system32) .
Έτσι δουλεύει όπως το έγραψα πιο πάνω;
πρέπει να δηλώσω μια environment variable έτσι;
Code: Select all
system("SET PATH=.;path"); //οπου path το directory του exe
system("application.exe -p");
Έτσι δουλεύει όπως το έγραψα πιο πάνω;
Resistance is futile. Join the foss-side now!
"UNIX is very simple, it just needs a genius to understand its simplicity." - Dennis Ritchie
"The things that I want, by Max Payne. A smoke. A whiskey. For the sun to shine. I want to sleep, to forget. To change the past. Unlimited ammo and a license to kill. But right then, more than anything, I wanted her."
- HdkiLLeR
- Venus Project Founder
- Posts: 4356
- Joined: Tue Jan 27, 2004 4:41 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: New York, NY
- Contact:
Και χωρίς να δηλώσεις το PATH ρητά μέσα απο μια system() call, η system() κληρονομεί τα environment variables. Συνεπώς απο την στιγμή που μία variable είναι global/system/environment τότε θα περάσει αυτόματα και στo πρόγραμμα σου αλλα και σε αυτό που καλείς μέσα απο την system. Δηλαδή βλέπει το PATH απο την στιγμή που το έχεις ορίσει σωστά. Προφανώς εάν θέλεις να το αλλάξεις για ένα συγκεκριμένο call μπορείς να το κανεις με τον τρόπο που αναφέρεις αλλά ακόμη καλύτερο είναι να κοιτάξεις σε αυτή την πρίπτωση μια απο τις exec() που αναφέρω παραπάνω ώστε να περάσεις εσύ ρητά ότι environment variable θέλεις (πχ το PATH) στο executable που έχεις χωρίς να κάνεις global αλλαγές.
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
- netharis
- Venus Former Team Member
- Posts: 1845
- Joined: Sun Jul 15, 2007 2:37 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Seattle, Washington
- Contact:
Kάπου σε έχασα...
Δηλαδή καλώντας την exec() μπορώ να περάσω environment variable σε ένα εκτελέσιμο, χωρίς να τη δηλώσω στα environment variables των windows γενικότερα;
Σε περίπτωση που θέλω να χρησιμοποιήσω τη system() πώς δηλώνω globally ένα εκτελέσιμο;
(Σε πρήζω, σόρρυ αλλα με ενδιαφέρει πολύ)
merged by maria_
Έχω και μία άλλη απορία, επειδή είναι σε C++ δεν ανοίγω άλλο θέμα. Έχω φτιάξει ένα πρόγραμμα το οποίο καλεί το netstat (netstat -e > temp.txt), διαβάζει το temp.txt και διαχωρίζει τα downloaded bytes απο τα uploaded.
και αφού έχω σε 2 string το downloaded και το uploaded χρησιμοποιώ το εξής για να τα κάνω int(θέλω να κρατάω αθροιστικό log)
στο output, πριν το atoi εμφανίζει κανονικά τη τιμή του download(ως string) αλλά μετά το atoi, to dl μόνο πέρνει αρνητική τιμή!
Τα bytes που δέχεται είναι συνήθως 10 ψήφια, για ποιό λόγο να βγάλει αρνητική τιμη;
EDIT:
τελικά τα έκανα όλα σε ΜΒ και ηρέμησα
Ευχαριστώ εκ των προτέρων
Δηλαδή καλώντας την exec() μπορώ να περάσω environment variable σε ένα εκτελέσιμο, χωρίς να τη δηλώσω στα environment variables των windows γενικότερα;
Σε περίπτωση που θέλω να χρησιμοποιήσω τη system() πώς δηλώνω globally ένα εκτελέσιμο;
(Σε πρήζω, σόρρυ αλλα με ενδιαφέρει πολύ)
merged by maria_
Έχω και μία άλλη απορία, επειδή είναι σε C++ δεν ανοίγω άλλο θέμα. Έχω φτιάξει ένα πρόγραμμα το οποίο καλεί το netstat (netstat -e > temp.txt), διαβάζει το temp.txt και διαχωρίζει τα downloaded bytes απο τα uploaded.
και αφού έχω σε 2 string το downloaded και το uploaded χρησιμοποιώ το εξής για να τα κάνω int(θέλω να κρατάω αθροιστικό log)
Code: Select all
dl = atoi(download.c_str());
ul = atoi(upload.c_str());
Τα bytes που δέχεται είναι συνήθως 10 ψήφια, για ποιό λόγο να βγάλει αρνητική τιμη;
EDIT:
τελικά τα έκανα όλα σε ΜΒ και ηρέμησα
Ευχαριστώ εκ των προτέρων
Resistance is futile. Join the foss-side now!
"UNIX is very simple, it just needs a genius to understand its simplicity." - Dennis Ritchie
"The things that I want, by Max Payne. A smoke. A whiskey. For the sun to shine. I want to sleep, to forget. To change the past. Unlimited ammo and a license to kill. But right then, more than anything, I wanted her."
- HdkiLLeR
- Venus Project Founder
- Posts: 4356
- Joined: Tue Jan 27, 2004 4:41 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: New York, NY
- Contact:
Κανένα πρίξημο, ναι αυτό ακριβώς είναι. Μια συγκεκριμένη έκδοση της exec() σου δίνει την δυνατότητα να το κάνεις αυτό (περνάς έναν πίνακα char[][] ο οποίος έχει την πρώτη στήλη environment variables και στην δεύτερη τα values τους. Πχ.netharis wrote:Kάπου σε έχασα...
Δηλαδή καλώντας την exec() μπορώ να περάσω environment variable σε ένα εκτελέσιμο, χωρίς να τη δηλώσω στα environment variables των windows γενικότερα;
Σε περίπτωση που θέλω να χρησιμοποιήσω τη system() πώς δηλώνω globally ένα εκτελέσιμο;
(Σε πρήζω, σόρρυ αλλα με ενδιαφέρει πολύ)
Code: Select all
env[0][0]="PATH";
env[0][1]="foo";
env[1][0]="EDITOR";
env[1][1]="vim";
Ωραία χαίρομαι που έλυσες καταρχάς το πρόβλημα σου, αλλά το θέμα είναι ότι δεν το έχεις δομήσει σωστά. Αυτό που πρέπει να κάνεις, για να αποφύγεις το system() και το output σε ένα file είναι να καλέσεις το netstat και να πάρεις το output απο ένα stream (πχ με ένα pipe). Έτσι κατευθείαν το output του netstat θα είναι σαν να το δίνεις input στο δικό σου executable.netharis wrote: merged by maria_
Έχω και μία άλλη απορία, επειδή είναι σε C++ δεν ανοίγω άλλο θέμα. Έχω φτιάξει ένα πρόγραμμα το οποίο καλεί το netstat (netstat -e > temp.txt), διαβάζει το temp.txt και διαχωρίζει τα downloaded bytes απο τα uploaded.
και αφού έχω σε 2 string το downloaded και το uploaded χρησιμοποιώ το εξής για να τα κάνω int(θέλω να κρατάω αθροιστικό log)στο output, πριν το atoi εμφανίζει κανονικά τη τιμή του download(ως string) αλλά μετά το atoi, to dl μόνο πέρνει αρνητική τιμή!Code: Select all
dl = atoi(download.c_str()); ul = atoi(upload.c_str());
Τα bytes που δέχεται είναι συνήθως 10 ψήφια, για ποιό λόγο να βγάλει αρνητική τιμη;
EDIT:
τελικά τα έκανα όλα σε ΜΒ και ηρέμησα
Ευχαριστώ εκ των προτέρων
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
- netharis
- Venus Former Team Member
- Posts: 1845
- Joined: Sun Jul 15, 2007 2:37 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: Seattle, Washington
- Contact:
1000 ευχαριστώ για όλα. Ήθελα να αποφύγω το stream λόγο τις απλότητας του προγράμματος, αλλα όπως είπες και πρίν (bad practice)...
Resistance is futile. Join the foss-side now!
"UNIX is very simple, it just needs a genius to understand its simplicity." - Dennis Ritchie
"The things that I want, by Max Payne. A smoke. A whiskey. For the sun to shine. I want to sleep, to forget. To change the past. Unlimited ammo and a license to kill. But right then, more than anything, I wanted her."
- HdkiLLeR
- Venus Project Founder
- Posts: 4356
- Joined: Tue Jan 27, 2004 4:41 pm
- Academic status: Alumnus/a
- Gender: ♂
- Location: New York, NY
- Contact:
Any time
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie
Version: 3.12
GCS d-->--- s+:+ a- C++(+++) BILS++++$ P--- L++++>+++++ E--- W+++ N+ o+ K w--
O M+ V-- PS++>+++ PE- Y++ PGP++ t+ 5+ X+ R* tv b++ DI- D+ G+++ e+++>++++ h r++ y++
------END GEEK CODE BLOCK------
"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity." -- Dennis Ritchie