Вставка (динамической) командной строки в функцию ShellExecute в C

#c #shellexecute #shellexecuteex

Вопрос:

Используя C (в Windows 10), я пытаюсь выполнить команду в cmd.exe которые выполняют файл python, который принимает другой файл (в формате csv). То, что я хотел бы сделать, это то же самое, как если бы я набирал в командной строке что-то вроде этого:

 python3 .plotCSV.py .filetoplot.csv
 

Или в лучшем режиме:

 python3 C:...DocumentsplotCSV.py C:...Documentsfiletoplot.csv
 

Для этого я использую ShellExecute вот так:

 ShellExecute(NULL, "open", "C:\Windows\System32\cmd.exe", "/c "python3 C:...DocumentsplotCSV.py C:...Documentsfiletoplot.csv"", NULL, SW_SHOWDEFAULT);
 

И для выбранного файла csv (например, filetoplot.csv) это работает. За исключением того, что для того, что мне нужно, имя csv-файла генерируется и меняется каждый раз в моей программе на C и сохраняется в переменной file_name.c_str() . Итак, если я использую это в ShellExecute, у меня есть:

 ShellExecute(NULL, "open", "C:\Windows\System32\cmd.exe", "/c "python3 C:...DocumentsplotCSV.py C:...Documentsfile_name.c_str()"", NULL, SW_SHOWDEFAULT);
 

Но, к сожалению (очевидно), это не работает, потому что на самом деле нет файла csv, переименованного в «имя_файла.c_str()».

Я также нашел функцию ShellExecuteEx и, желая повторить ту же процедуру, я думаю, что функцию следует использовать следующим образом:

 SHELLEXECUTEINFO info = {0};

        info.cbSize = sizeof(SHELLEXECUTEINFO);
        info.fMask = SEE_MASK_NOCLOSEPROCESS;
        info.hwnd = NULL;
        info.lpVerb = NULL;
        info.lpFile = "cmd.exe"; 
        info.lpParameters = ("python3 C:...DocumentsplotCSV.py C:...Documentsfile_name.c_str()");
        info.lpDirectory = NULL;
        info.nShow = SW_SHOW;
        info.hInstApp = NULL;

        ShellExecuteEx(amp;info);
 

Но даже здесь это не работает (я, вероятно, неправильно понимаю, как работает эта функция).

Надеясь, что я хорошо объяснился, я любезно прошу вашего совета о том, как действовать в этом отношении.

Большое спасибо

Ответ №1:

Вы пытаетесь написать код внутри строкового литерала.
Это невозможно в C !

Сначала вам нужно создать строку динамического параметра, а затем передать ее функции.
std::string имеет перегруженный оператор, поддерживающий строковые литералы ( const char * ).

 std::string param1 = "/c "python3 C:\...\Documents\plotCSV.py C:\...\Documents\"   file_name   '"';

ShellExecute(NULL, "open", "C:\Windows\System32\cmd.exe", param1.c_str(), NULL, SW_SHOWDEFAULT);
 

Комментарии:

1. Уважаемый @Лев М. большое вам спасибо за ответ, он работает!

2. И еще спасибо @marc_s за модерацию и исправление ошибок в моем посте!