Page 1 of 1

Κλήση/ενσωμάτωση προγραμμάτων

Posted: Sat Oct 13, 2007 7:54 pm
by madMax
Καλησπέρα...
Είναι δυνατόν στο πρόγραμμα που γράφεις να συμπεριλάβεις κατάλληλες εντολες ώστε σε κάποιο σημείο του να εκτελείται ενα άλλο(εμπορικό) πρόγραμμα και να μπορείς να δώσεις επίσης παραμέτρους,settings, κτλ του προγράμματος αυτού?

ή

να ελέγξεις συγκεκριμένες λειτουργίες μιας σελίδας(συγκεκριμένα buttons).

Posted: Sat Oct 13, 2007 11:43 pm
by HdkiLLeR
Σε όλες τις γλώσσες προγραμματισμού (ακόμη και σε scripting) μπορείς να καλείς άλλα executables και να περάσεις παραμέτρους σε αυτά. Τώρα ειδικότερα για το πως μπορείς να κάνεις handle μέσα απο μια εφαρμογή μια άλλη είναι λίγο πιο advanced θέμα και θέλει συζήτηση.

Posted: Sun Oct 14, 2007 2:32 am
by tsilochr
μια τεχνική για να ανοίξεις ένα πρόγραμμα είναι να καλέσεις shell κλήση του executable προγραμματιστικά μέσα από το ΑΡΙ της γλώσσας που γράφεις. συνήθως τα executables παίρνουν παραμέτρους από το command line πχ ο mozillla παίρνεο την σελίδα που θα ανοίξει.

Posted: Sun Oct 14, 2007 11:43 am
by madMax
thanks HDkiller,tsilochr...
οτιδήποτε νέο καλοδεχούμενο.

Posted: Tue Oct 16, 2007 3:42 pm
by netharis
σε C++ για να καλέσω κάτι εγώ χρησιμοποιώ:

Code: Select all

system("application.exe -p");
καλύτερα να βάλεις το executable μέσα στο system32 για να το καλείς απο παντού.
Τώρα για να κάνεις δυναμική εκχώρηση στο system ( αφού είναι const char) :
π.χ θες να του θέσεις εσύ απο input το πρόγραμμα και τις παραμέτρους

Code: Select all

  
             string InputCommand;
             
             cin >> InputCommand;
             const char* command = InputCommand.c_str ();
             system(command);

Δεν ξέρω σε ποιά γλώσσα ή πλατφόρμα δουλεύεις αλλά αυτή είναι η γενική ιδέα.

Posted: Tue Oct 16, 2007 7:46 pm
by HdkiLLeR
netharis wrote:σε C++ για να καλέσω κάτι εγώ χρησιμοποιώ:

Code: Select all

system("application.exe -p");
καλύτερα να βάλεις το executable μέσα στο system32 για να το καλείς απο παντού.
Δεν είναι ανάγκη να είναι στο system32 των windows (μάλιστα είναι κακό practice αυτό). Τρέχοντας την system() θα κοιτάξει εάν το application.exe βρίσκεται στο current path και εάν το βρεί θα το εκτελέσει. Διαφορετικά θα κοιτάξει σε κάθε directory που βρίσκεται στο environment variable: PATH. Τώρα σχετικά με την system() απλά εκτελεί το executable με τα ορίσματα του. Εαν ενδιαφέρεσαι ή θέλεις περισσότερο advanced έλεγχο στο τι θα περάσεις στο application που θα καλέσεις πρέπει να κοιτάξεις την οικογένεια exec: http://www.opengroup.org/onlinepubs/000 ... /exec.html

Πχ μπορεί να θέλεις να καλέσεις ένα executable με συγκεκριμένο environment (συγκεκριμένα environment variables, arguments κλπ κλπ).

Posted: Tue Oct 16, 2007 8:28 pm
by netharis
Δηλαδή σε windows, για να τρέξω κάτι χωρίς το exec, μέσα απο το system χωρίς να έχω στο system32 το exe,
πρέπει να δηλώσω μια environment variable έτσι;

Code: Select all

system("SET PATH=.;path"); //οπου path  το directory του exe

system("application.exe -p");

Δεν το είχα σκεφτεί ποτέ (όντως δεν είναι λογικό να αντιγράφω κάθε exe μέσα στο system32) .
Έτσι δουλεύει όπως το έγραψα πιο πάνω;

Posted: Wed Oct 17, 2007 2:45 pm
by HdkiLLeR
Και χωρίς να δηλώσεις το PATH ρητά μέσα απο μια system() call, η system() κληρονομεί τα environment variables. Συνεπώς απο την στιγμή που μία variable είναι global/system/environment τότε θα περάσει αυτόματα και στo πρόγραμμα σου αλλα και σε αυτό που καλείς μέσα απο την system. Δηλαδή βλέπει το PATH απο την στιγμή που το έχεις ορίσει σωστά. Προφανώς εάν θέλεις να το αλλάξεις για ένα συγκεκριμένο call μπορείς να το κανεις με τον τρόπο που αναφέρεις αλλά ακόμη καλύτερο είναι να κοιτάξεις σε αυτή την πρίπτωση μια απο τις exec() που αναφέρω παραπάνω ώστε να περάσεις εσύ ρητά ότι environment variable θέλεις (πχ το PATH) στο executable που έχεις χωρίς να κάνεις global αλλαγές.

Posted: Thu Oct 18, 2007 12:30 pm
by netharis
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)

Code: Select all

dl = atoi(download.c_str());
ul = atoi(upload.c_str());
στο output, πριν το atoi εμφανίζει κανονικά τη τιμή του download(ως string) αλλά μετά το atoi, to dl μόνο πέρνει αρνητική τιμή!
Τα bytes που δέχεται είναι συνήθως 10 ψήφια, για ποιό λόγο να βγάλει αρνητική τιμη;

EDIT:
τελικά τα έκανα όλα σε ΜΒ και ηρέμησα

Ευχαριστώ εκ των προτέρων :roll:

Posted: Fri Oct 19, 2007 4:44 pm
by HdkiLLeR
netharis wrote:Kάπου σε έχασα...
Δηλαδή καλώντας την exec() μπορώ να περάσω environment variable σε ένα εκτελέσιμο, χωρίς να τη δηλώσω στα environment variables των windows γενικότερα;
Σε περίπτωση που θέλω να χρησιμοποιήσω τη system() πώς δηλώνω globally ένα εκτελέσιμο;

(Σε πρήζω, σόρρυ αλλα με ενδιαφέρει πολύ)
Κανένα πρίξημο, ναι αυτό ακριβώς είναι. Μια συγκεκριμένη έκδοση της exec() σου δίνει την δυνατότητα να το κάνεις αυτό (περνάς έναν πίνακα char[][] ο οποίος έχει την πρώτη στήλη environment variables και στην δεύτερη τα values τους. Πχ.

Code: Select all

env[0][0]="PATH";
env[0][1]="foo";
env[1][0]="EDITOR";
env[1][1]="vim";
κλπ...
netharis wrote: 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());
στο output, πριν το atoi εμφανίζει κανονικά τη τιμή του download(ως string) αλλά μετά το atoi, to dl μόνο πέρνει αρνητική τιμή!
Τα bytes που δέχεται είναι συνήθως 10 ψήφια, για ποιό λόγο να βγάλει αρνητική τιμη;

EDIT:
τελικά τα έκανα όλα σε ΜΒ και ηρέμησα

Ευχαριστώ εκ των προτέρων :roll:
Ωραία χαίρομαι που έλυσες καταρχάς το πρόβλημα σου, αλλά το θέμα είναι ότι δεν το έχεις δομήσει σωστά. Αυτό που πρέπει να κάνεις, για να αποφύγεις το system() και το output σε ένα file είναι να καλέσεις το netstat και να πάρεις το output απο ένα stream (πχ με ένα pipe). Έτσι κατευθείαν το output του netstat θα είναι σαν να το δίνεις input στο δικό σου executable.

Posted: Sat Oct 20, 2007 12:24 am
by netharis
1000 ευχαριστώ για όλα. Ήθελα να αποφύγω το stream λόγο τις απλότητας του προγράμματος, αλλα όπως είπες και πρίν (bad practice)...

Posted: Sun Oct 21, 2007 2:42 am
by HdkiLLeR
Any time