PDA

Visualizza la versione completa : [C] lanciare un eseguibile...particolare


standard
19-02-2003, 10:56
Ciao a tutti,
spero di riuscire a spiegarmi:
ho un grosso programma in C che sembra funzionare correttamente, quello che fa è prendere dei dati da file di testo ed elaborarli.
Quando lo lancio da Visual C++, o cliccando sull'eseguibile non ho alcun problema.

I problemi nascono quando cerco di lanciare il file da un foglio Excel.
La chiamata è giusta:

Shell("percorso\programma.exe")

ma, il programma si interrompe e parte il debug...
mi sembra d'aver capito che il programma exe viene sì lanciato correttamente, ma
questo poi non riesca a caricare i dati dai file di testo!
non capisco perchè!! i file ci sono.

Aggiungo che, nel programma non c'è alcun controllo sull'apertura corretta dei file di testo, (visto che è previsto che ci siano sempre), e il problema mi viene segnalato proprio al primo fscanf.
Qualcuno mi può illuminare?

Johnny_Depp
19-02-2003, 11:07
secondo me il problema sta nella chiamata ai file di testo.

utilizzi un patch relativo?

se [SI] prova a cambiarlo con un patch assoluto.

standard
19-02-2003, 11:51
grazie Johnny per la risposta,
in effetti sì, uso path relativi, il problema però è che DEVO
usare un path relativo; infatti mi occorre poter spostare l'eseguibile in cartelle diverse (in cui però ci sono sempre i file di testo che cerco)...non so se mi sono spiegato...
insomma:

finp = fopen("C:\\directory\\file_testo.txt","r");

non lo posso usare perchè non conosco a priori le directory...

Mi servirebbe un modo in C per recuperare il PATH dell'eseguibile,
avete qualche idea?
o soluzioni alternative?

standard
20-02-2003, 10:31
up

standard
20-02-2003, 21:51
niente?

ci sarà un modo per recuperare il path della directory che contiene l'eseguibile!...o no?

$$$
20-02-2003, 21:59
se il programma è un MZ /PE/NE/LE puoi usare GetCurrentDirectory oppure guardarti le variabili d'ambiente passata al programma... che dovrebbero contenere tutti i path e la directory corrente.

standard
21-02-2003, 12:09
inanzitutto grazie $$$,
ho qualche domanda da farti sul tuo intervento (sono un po' ignorante in materia):
1)che significa programma MZ /PE/NE/LE ?
2)come faccio a guardare le variabili d'ambiente passate al programma?

dopo questa premessa, ho fatto così (per prova):



#include <windows.h>

char DirText[500];
...

GetCurrentDirectory(500,DirText);
printf("\n%s\n",DirText);
strcat(DirText,"\\punctin.txt");
printf("\n%s\n",DirText);
fpt = fopen(DirText,"r");
if(fpt==NULL) printf("\n\nFILE NON PRESENTE NELLA DIRECTORY DELL'ESEGUIBILE");
else{
fscanf(fpt,"%s",stringa);
printf("\n\n%s",stringa);
fclose(fpt);
}
...


bene.
lancio da VC++: tutto ok!
lancio cliccando sull'eseguibile: tutto ok!
lancio da un foglio Excel (nella stessa cartella dell'eseguibile)usando:



Sub LanciaEXE()
Shell (ThisWorkbook.Path & "\prova_dati_da_file.exe ")
End Sub


non trova il file e, ora la CurrentDirectory è:
F:\Documents and Settings\William\Documenti

che assolutamente non centra nulla con la directory dell'eseguibile!!
(che invece è: C:\Documents and Settings\William\Desktop\IER)
:eek: :eek:
perchè?? che diavolo fa Excel?
penso che quindi non avrei bisogno nemmno del GetCurrentDirectory
se riuscissi a capire perchè mi rida quella directory.

per favore qualcuno mi sveli questo "arcano"

Andrea Simonassi
21-02-2003, 14:42
Non GetCurrentDirectory ma GetModuleFileName è la funzione che dice dove si trova un dato eseguibile, la working directory potrebbe benissimo essere un'altra.

$$$
21-02-2003, 14:57
GetCurrentDirectory però viene settata da excel o da chi lancia il tuo exe ... quindi puo benissimo metterci anche "n:\ciao\ciao a tutti\"....

standard
21-02-2003, 15:41
SIII''

GetModuleFileName funziona!!
questo è lo scheletro del codice che ho usato:



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>

char DirText[500];
char stringa[50];
char *appoggio;

int main(){
FILE *fpt;
GetModuleFileName(NULL, DirText, 500);

appoggio = strrchr(DirText,'\\');
DirText[(strlen(DirText)-strlen(appoggio))+1]='\0';
strcat(DirText,"punctin.txt");

fpt = fopen(DirText,"r");
if(fpt==NULL) printf("\n\nFILE NON PRESENTE NELLA DIRECTORY DELL'ESEGUIBILE");
else{
fscanf(fpt,"%s",stringa);
printf("\n\n%s",stringa);
fclose(fpt);
}

getchar();

return 0;
}

giusto per imparare qualcos'altro:




1)che significa programma MZ /PE/NE/LE ?
2)come faccio a guardare le variabili d'ambiente passate al programma?

Loading