2009-05-09 9 views
2

Je veux écrire un programme c qui appelle un autre exe. Ce programme encapsuleur c ne fait rien d'autre qu'une variable d'environnement avant d'appeler mon exec original. Par exemple, dire que j'ai un exe appelé test.exe et je l'ai écrit testwrapper.exe Je veux l'appeler comme testwrapper.exe <parameter>, et à l'intérieur, il devrait appeler test.exe <parameter>C Le programme argv ne contient pas de guillemets

Mon problème est que quand je l'appelle test.exe comme test.exe "c:\program files\input", C échappe à " ? passes comme paramètre

ce qui est à l'origine de ce problème, et que puis-je faire pour y remédier

+2

Pouvez-vous poster la ligne dans votre code qui appelle test.exe? –

+0

Que diriez-vous d'un code? – dirkgently

Répondre

9

Les citations sont censées permettre des arguments avec des espaces. par exemple:

test.exe "this is an argument with spaces" 

Afin de mettre des guillemets dans l'argument, leur échapper:

test.exe "\"c:\program files\input\"" 

Si vous appeliez cela à partir d'un programme C, vous auriez à double-échapper aux citations. Par exemple:

system("test.exe \"\\\"c:\\program files\\input\\\"\""); 

Il serait utile, bien que, pour voir votre ligne de code qui fonctionne test.exe.

2

échapper à vos citations en ajoutant une barre oblique inverse avant de les: \ »

En outre, vous pouvez utiliser la barre oblique comme répertoire deliminator:/De cette façon, vous n'avez pas d'échapper à vos antislashs (vous encore pouvez si vous voulez bien: \\)

0

Si vous êtes sur un système unix, puis utilisez execv comme suggéré par sucuri. Sous windows, utilisez _execv() défini dans process.h.

0

int main (int argc, char * argv [])

{

char *install_dir = 0; 
char perlbin[MAX_PATH]; 
char **new_argv; 
int index = 0; 

setlocale(LC_ALL, ""); 
install_dir = get_install_dir(); 

sprintf(perlbin,"%sbin%cperl.bin",install_dir,sep); 
set_env_variable(install_dir); 

new_argv = malloc(MAX_PATH); 
new_argv[0] = malloc(sizeof(char)*(strlen("perl.bin")+1)); 
strcpy (new_argv[0],"perl.bin"); 
for (index = 1 ; index < argc ; index++) 
{ 
    new_argv[index] = malloc(sizeof(char)*(strlen(argv[index])+1)); 
    strcpy (new_argv[index], argv[index]); 
} 
new_argv[index] = NULL; 

_execv(perlbin,new_argv); 
exit (0); 

}

0

Vous pouvez également ajouter les guillemets doubles vous-même.

(avertissement: rapide piraté, non testé)

char ** quoted_argv = malloc((argc - 1) * sizeof(char *)); 
size_t i; 
for(i = 0; i < argc - 1; i++) 
{ 
    quoted_argv[i] = malloc(strlen(argv[i + 1]) + 3); /* allocate space for \0 and quotes */ 
    sprintf(quoted_argv[i], "\"%s\"", argv[i + 1]); 
} 

/* ... use quoted_argv ... */ 

for(i = 0; i < argc - 1; i++) 
    free(quoted_argv[i]); 
free(quoted_argv); 
Questions connexes