Newsgroup: it.comp.lang.c
Titolo: Leggere il path dell'eseguibile da dentro il programma

Salve al newsgroup. Vorrei acquisire dal mio programma (una applicazione 
console in XP e successivi..) il path name completo dell'eseguibile in modo 
da sapere da dove caricare altri files che si devono trovare nella stessa 
cartella dove si trova l'exe.
Vorrei fare il tutto senza usare la GetModuleFileName che so gia' 
risolverebbe il problema perche' non vorrei portarmi dietro windows.h con 
annessi e connessi. Il programma e scritto in ANSI C e mi piacerebbe usare 
un altro sistema se e' possibile. Pero' non mi viene in mente nulla. Qualche 
idea ??
Sandro


Dipende da che compilatore usi, ma e' molto probabile
che te lo ritrovi negli argomenti della funzione main()
Guarda cosa esce se provi a compilare ed eseguire questo
programmino...
#include <stdio.h>
int main( int argc, char *argv[] )
{
	printf("%s\n", argv[0]);
	return 0;
}
ciao
Giacomo

 dell'eseguibile, non certo il suo path)
In realta' e' piu' complicato di cosi': ogni implementazione puo'
mettere cio' che vuole in argv[0] (per i successivi e' come dici
tu, sono gli argomenti sulla command line).
Se hai fortuna, la tua implementazione puo' metterci il path
completo all'eseguibile oppure no (come nel tuo caso)
Resta comunque una soluzione non portabile ovviamente. :)
ciao
Giacomo

On Jun 22, 10:05 am, Giacomo Degli Esposti

Nel primo parametro potrebbe esserci qualsiasi cosa, come addirittura
potrebbe *non* esserci.
Su unix:
execl("path", 0);
o
execl("path", NULL, 0);
In linea di massima su _quasi_ tutti i sistemi che ho visto il primo
parametro è il nome (o soprannome) del programma che corre.
Detto questo, sempre su unix (ma ci sono funzioni simili su ogni
piattaforma) io andrei per qualcosa del tipo:
char *pn = NULL, *name = NULL;
if (argc>0)
    if ((pn = strdup(argv[0]))!=NULL)
        name = basename(pn);
Ciao!

 potrebbe *non* esserci.
No, da standard C99, se vengono dati parametri (nel main), il
primo e' il nome dell' eseguibile OPPURE una stringa vuota:
"If the value of argc is greater than zero, the string pointed to by 
argv[0] represents the program name; argv[0][0] shall be the null 
character if the program name is not available from the host environment."
Per C89 e C90 dovrebbe essere lo stesso, ma non ho sottomano lo
standard: comunque credo che ormai tutti i compilatori decenti
siano allineati almeno al C99...
A.

 che te lo ritrovi negli argomenti della funzione main()
Non è la via giusta. Chi ha "lanciato" il processo può decidere di
metterci quel che vuole negli argomenti. Poi di solito c'è il nome
dell'eseguibile, altre un path relativo.
L'unica alternativa è codice dipendente dall'OS. 


Questa non la sapevo, ma visto che sei sicuro per il C99 e che io non
l'avevo sentita mai potrebbe essere qualcosa di nuovo.
In ogni caso non dipende dal compilatore, ma dal sistema operativo (e
dalle funzioni di libreria che permettono di "aprire" un altro
programma), per cui il discorso è un attimo più complesso ;)
Ciao!

 L'unica alternativa codice dipendente dall'OS.
Quoto. Infatti ho chiarito successivamente che non e' comunque
una soluzione portabile.
Gia' che c'ero, ho anche spulciato nelle FAQ:
19.31:  How can my program discover the complete pathname to the
        executable from which it was invoked?
A:      argv[0] may contain all or part of the pathname, or it may
        contain nothing.  You may be able to duplicate the command
        language interpreter's search path logic to locate the
        executable if the name in argv[0] is present but incomplete.
        However, there is no guaranteed solution.
ciao
Giacomo

 l'avevo sentita mai potrebbe essere qualcosa di nuovo.
Non direi... lo standard C99 e' ormai decennale ;-)
BTW: il C non dispone di funzioni per manipolare oggetti diversi
dai "file", purtroppo.
Pero' le librerie posix (e GCC) hanno delle funzioni per farlo, ad 
esempio la getcwd() per ottenere il path corrente.
Anche in MS VisualStudio ci sono delle funzioni *equivalenti* :
per esempio l' analogo di getcwd si chiama... _getcwd, e funziona
uguale. Purtroppo questo costringe ad usare delle compilazioni
condizionate et simila per avere del codice portabile :-(
A.

 A.
Infatti :(
Come ho scritto sull'altro thread comunque un po' tutti usano delle
librerie apposta per gestire la compatibilità in maniera trasparente
<OT>(e, visto che sembri preparato sull'argomento, un parere anche tuo
sulla mia lib sarebbe prezioso) :-)</OT>
Ciao!