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

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
madMax
byte level
byte level
Posts: 90
Joined: Thu Jul 05, 2007 2:19 pm

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

Post by madMax » Sat Oct 13, 2007 7:54 pm

Καλησπέρα...
Είναι δυνατόν στο πρόγραμμα που γράφεις να συμπεριλάβεις κατάλληλες εντολες ώστε σε κάποιο σημείο του να εκτελείται ενα άλλο(εμπορικό) πρόγραμμα και να μπορείς να δώσεις επίσης παραμέτρους,settings, κτλ του προγράμματος αυτού?

ή

να ελέγξεις συγκεκριμένες λειτουργίες μιας σελίδας(συγκεκριμένα buttons).
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Sat Oct 13, 2007 11:43 pm

Σε όλες τις γλώσσες προγραμματισμού (ακόμη και σε 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
User avatar
tsilochr
Wow! Terabyte level
Wow! Terabyte level
Posts: 3246
Joined: Tue Mar 16, 2004 2:47 pm
Academic status: PhD
Gender:
Location: mm.aueb.gr
Contact:

Post by tsilochr » Sun Oct 14, 2007 2:32 am

μια τεχνική για να ανοίξεις ένα πρόγραμμα είναι να καλέσεις shell κλήση του executable προγραμματιστικά μέσα από το ΑΡΙ της γλώσσας που γράφεις. συνήθως τα executables παίρνουν παραμέτρους από το command line πχ ο mozillla παίρνεο την σελίδα που θα ανοίξει.
User avatar
madMax
byte level
byte level
Posts: 90
Joined: Thu Jul 05, 2007 2:19 pm

Post by madMax » Sun Oct 14, 2007 11:43 am

thanks HDkiller,tsilochr...
οτιδήποτε νέο καλοδεχούμενο.
User avatar
netharis
Venus Former Team Member
Posts: 1845
Joined: Sun Jul 15, 2007 2:37 pm
Academic status: Alumnus/a
Gender:
Location: Seattle, Washington
Contact:

Post by netharis » Tue Oct 16, 2007 3:42 pm

σε 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);

Δεν ξέρω σε ποιά γλώσσα ή πλατφόρμα δουλεύεις αλλά αυτή είναι η γενική ιδέα.
Image
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."
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Tue Oct 16, 2007 7:46 pm

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 κλπ κλπ).
-----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
User avatar
netharis
Venus Former Team Member
Posts: 1845
Joined: Sun Jul 15, 2007 2:37 pm
Academic status: Alumnus/a
Gender:
Location: Seattle, Washington
Contact:

Post by netharis » Tue Oct 16, 2007 8:28 pm

Δηλαδή σε windows, για να τρέξω κάτι χωρίς το exec, μέσα απο το system χωρίς να έχω στο system32 το exe,
πρέπει να δηλώσω μια environment variable έτσι;

Code: Select all

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

system("application.exe -p");

Δεν το είχα σκεφτεί ποτέ (όντως δεν είναι λογικό να αντιγράφω κάθε exe μέσα στο system32) .
Έτσι δουλεύει όπως το έγραψα πιο πάνω;
Image
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."
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Wed Oct 17, 2007 2:45 pm

Και χωρίς να δηλώσεις το 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
User avatar
netharis
Venus Former Team Member
Posts: 1845
Joined: Sun Jul 15, 2007 2:37 pm
Academic status: Alumnus/a
Gender:
Location: Seattle, Washington
Contact:

Post by netharis » Thu Oct 18, 2007 12:30 pm

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:
Image
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."
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Fri Oct 19, 2007 4:44 pm

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.
-----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
User avatar
netharis
Venus Former Team Member
Posts: 1845
Joined: Sun Jul 15, 2007 2:37 pm
Academic status: Alumnus/a
Gender:
Location: Seattle, Washington
Contact:

Post by netharis » Sat Oct 20, 2007 12:24 am

1000 ευχαριστώ για όλα. Ήθελα να αποφύγω το stream λόγο τις απλότητας του προγράμματος, αλλα όπως είπες και πρίν (bad practice)...
Image
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."
User avatar
HdkiLLeR
Venus Project Founder
Venus Project Founder
Posts: 4356
Joined: Tue Jan 27, 2004 4:41 pm
Academic status: Alumnus/a
Gender:
Location: New York, NY
Contact:

Post by HdkiLLeR » Sun Oct 21, 2007 2:42 am

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
Post Reply

Return to “Προγραμματισμός”