#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 за модерацию и исправление ошибок в моем посте!