2009-05-09 6 views
2

Я хочу написать программу c, которая вызывает другой exe. Эта программа-оболочка c ничего не делает, кроме как установить некоторую переменную среды, прежде чем я вызову свой исходный exec. Например, скажем, у меня есть ехе называется test.exe и я написал testwrapper.exe Я хочу назвать его как testwrapper.exe <parameter>, и внутренне он должен вызвать test.exe <parameter>C Программа argv не содержит двойных кавычек

Моя проблема заключается в том, что, когда я называю test.exe, как test.exe "c:\program files\input", C сбегает с " ? проходит в качестве параметра

Что является причиной этой проблемы, и что я могу сделать, чтобы исправить это

+2

Вы можете разместить строку в коде, который вызывает test.exe? –

+0

Как насчет некоторого кода? – dirkgently

ответ

9

кавычки должны позволить аргументы с пробелами, например:.

test.exe "this is an argument with spaces" 

Для того, чтобы поставить кавычки в аргументе, избежать их:

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

Если вы называли это из программы C, вам придется дважды избежать кавычки. Например:

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

Было бы полезно, хотя, чтобы увидеть вашу строку кода, который работает test.exe.

2

избежать ваших котировок, добавив обратный косую черту перед ними: \»

Кроме того, вы можете использовать слэш в качестве каталога deliminator:/Таким образом, вы не должны бежать ваш слэш (вам все еще может, если вы хотите, хотя: \\)

2

Ну, если вы хотите, чтобы передать точные аргументы, просто использовать execv:

execv (ARGV [0], ARGV);

Нет необходимости чтобы избежать чего-либо ...

руководство для всех них execX функций должно помочь:

http://www.openbsd.org/cgi-bin/man.cgi?query=execvp&apropos=0&sektion=0&manpath=OpenBSD+Current&arch=i386&format=html

0

Если вы на системе UNIX, а затем использовать execv как предложено sucuri. В окнах используйте _execv(), определенные в process.h.

0

INT основной (интермедиат ARGC, символ * 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

Вы можете также добавить двойные кавычки самостоятельно.

(предупреждение: быстро взломана, непроверенный)

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); 
Смежные вопросы