wxShell и wxExecute не любят двойные кавычки в папраметрах

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
User avatar
cutecode
Super wx Problem Solver
Super wx Problem Solver
Posts: 425
Joined: Fri Dec 09, 2016 7:28 am
Contact:

wxShell и wxExecute не любят двойные кавычки в папраметрах

Post by cutecode »

Убил кучу времени чтоб понять в чом дело.

Оказывается wxShell и wxExecute не любят двойные кавычки в папраметрах.
Например, мне надо передать exe-шнику имя файла, в котором есть пробелы. Я соответственно, заключаю этот файл в двойные кавычки.
Но в этом случае, команда возвращается с ошибкой. Если ту же команду выполнить "ручками" в DOS-овской shell, то все работает прекрасно

например команда

Code: Select all

	szShell = wxString::Format(L"\"%sopenssl\" x509 -engine gost -inform %s -in \"%s\" > %s", szOpenSSLPath, openssl_get_cert_encoding(path2), path2, filename);
копирую содержимое строки szShell в DOS-shell и выполняется без ошибки, а wxShell и wxExecute возвращают пустой файл

Если уберу кавычки в парамете, то выполняется без ошибки

Code: Select all

	szShell = wxString::Format(L"\"%sopenssl\" x509 -engine gost -inform %s -in %s > %s", szOpenSSLPath, openssl_get_cert_encoding(path2), path2, filename);
Неужели придется просить клиента не использовать пробелы в имени файла
wx 3.1.6 win/mac/linux

regards,
Alexander Saprykin
https://v2.dental-soft.ru
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Re: wxShell и wxExecute не любят двойные кавычки в папраметрах

Post by T-Rex »

Windows. С кавычками работает.

Code: Select all

wxExecute(wxT("notepad \"D:\\Projects\\README.md\""));
Linux. Тоже работает нормально.

Code: Select all

long exitCode = wxExecute(wxT("gedit \"/home/t-rex/demo.txt\""));
Какая результирующая строка получается после подстановки параметров?
Как себя ведет команда без редиректа выдачи в файл?
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: wxShell и wxExecute не любят двойные кавычки в папраметрах

Post by ONEEYEMAN »

Dobrogo vremeni sutok,
Kakaja oshibka vozvraschaetsja?
Chto proishodit vnutri wxShell i wxExecute? T.e. gde proskakivaet oshibka?

Spasibo.
User avatar
cutecode
Super wx Problem Solver
Super wx Problem Solver
Posts: 425
Joined: Fri Dec 09, 2016 7:28 am
Contact:

Re: wxShell и wxExecute не любят двойные кавычки в папраметрах

Post by cutecode »

Пардон. Я не доконца описал ситуацию

1. это под Windows
2. такое бывает не совсеми EXE-шниками, а пока тока с openssl.exe
4. без редиректа тоже пробовал. в openssl есть параметр "-out arg - output file - default stdout"

переписал команду так

Code: Select all

	szShell = wxString::Format(L"\"%sopenssl\" x509 -engine gost -inform %s -in \"%s\" -out %s & pause", 
		szOpenSSLPath, szInForm, path2, filename);
	int bResult = wxShell(szShell);
на экране вот что

Code: Select all

Синтаксическая ошибка в имени файла, имени папки или метке тома.
Для продолжения нажмите любую клавишу . . .
В Vsual Studio беру результирующую строку ч/з QuikWatch
И выполню в DOS-SHELL,

Code: Select all

"C:\_Build\__soft_it\Exec\_DebugU\_SYS\execs\win32\openssl\openssl" x509 -engine gost -inform pem -in "C:\Users\Alex\AppData\Local\Temp\80B1.tmp" -out C:\Users\Alex\AppData\Local\Temp\dental-soft\r9942zOf6JCsj5TLi6\80B0.tmp & pause
то ошибки нет

Code: Select all

engine "gost" set.
Для продолжения нажмите любую клавишу . . .
Опять же заменяю

Code: Select all

-in \"%s\"
на

Code: Select all

-in %s
и все прекрасно, ошибка исчезает
wx 3.1.6 win/mac/linux

regards,
Alexander Saprykin
https://v2.dental-soft.ru
User avatar
cutecode
Super wx Problem Solver
Super wx Problem Solver
Posts: 425
Joined: Fri Dec 09, 2016 7:28 am
Contact:

Re: wxShell и wxExecute не любят двойные кавычки в папраметрах

Post by cutecode »

Перписал код так

Code: Select all

	wxString sz = L"\"C:\\_Build\\__soft_it\\Exec\\_DebugU\\_SYS\\execs\\win32\\openssl\\openssl\" x509 -engine gost -inform pem -in \"C:\\Users\\Alex\\AppData\\Local\\Temp\\80B1.tmp\" -out C:\\Users\\Alex\\AppData\\Local\\Temp\\dental-soft\\r9942zOf6JCsj5TLi6\\80B0.tmp & pause";
	wxShell(sz);

	sz = L"\"C:\\_Build\\__soft_it\\Exec\\_DebugU\\_SYS\\execs\\win32\\openssl\\openssl\" x509 -engine gost -inform pem -in C:\\Users\\Alex\\AppData\\Local\\Temp\\80B1.tmp -out C:\\Users\\Alex\\AppData\\Local\\Temp\\dental-soft\\r9942zOf6JCsj5TLi6\\80B0.tmp & pause";
	wxShell(sz);
тоже самое
в первом случае

Code: Select all

Синтаксическая ошибка в имени файла, имени папки или метке тома.
Для продолжения нажмите любую клавишу . . .
во втором

Code: Select all

engine "gost" set.
Для продолжения нажмите любую клавишу . . .
wx 3.1.6 win/mac/linux

regards,
Alexander Saprykin
https://v2.dental-soft.ru
ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 7458
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

Re: wxShell и wxExecute не любят двойные кавычки в папраметрах

Post by ONEEYEMAN »

A primer exec otrabatyvaet?
User avatar
T-Rex
Moderator
Moderator
Posts: 1248
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

Re: wxShell и wxExecute не любят двойные кавычки в папраметрах

Post by T-Rex »

В общем, там, наверное, проблема с pause или с концовкой где выдача переадресуется в файл.

У меня скачанный openssl с пол-пинка так и не заработал с gost, а настраивать лень и некогда.
Но с pause я вижу что оно там в консоль выводит usage, а без pause сразу консольное окно закрывается. Может даже все параметры подхватило.

Пробовал как-то так:

Code: Select all

wxString openssl_path = wxT("D:\\Projects\\wxTest\\openssl-0.9.8h-1-bin\\bin\\");
	wxString inform = wxT("pem");
	wxString path2 = wxT("D:\\Projects\\wxTest\\cert\\ca.crt");
	wxString filename = wxT("D:\\Projects\\wxTest\\out.log");

	wxString command = wxString::Format(
		wxT("\"%sopenssl.exe\" x509 -engine gost -inform %s -in \"%s\" -out \"%s\""),
		openssl_path.wc_str(), inform.wc_str(), path2.wc_str(), filename.wc_str());
	wxLogDebug(command);
	wxExecute(command);
Лучше тогда переделать на wxProcess и смотреть что оно там выводит через потоки.
User avatar
cutecode
Super wx Problem Solver
Super wx Problem Solver
Posts: 425
Joined: Fri Dec 09, 2016 7:28 am
Contact:

Re: wxShell и wxExecute не любят двойные кавычки в папраметрах

Post by cutecode »

Я "pause" делаю тока чтоб увидеть сообщения об ошибке.
Ладно, буду делать без кавычек, все равно во всех трех OS во временных файлах нет пробелов.
Я позже планирую все это на API-openssl переделать, чтоб EXE-шники не запускать.

нашел еще непонятку с wxShell и wxExecute

Code: Select all

	szShell.Printf(L"\"%sopenssl\" x509 -engine gost -serial -noout -inform %s -in %s > %s",
		szOpenSSLPath, szInForm, szCertPath2, out);

//	int bResult = wxShell(szShell);
	int bResult = wxExecute(szShell, wxEXEC_SYNC | wxEXEC_HIDE_CONSOLE);
Если выполнить с wxShell, то серийник сертификата получаю
Если выполнить wxExecute, то серийника получить не могу

Ладно, работает и ладно.
wx 3.1.6 win/mac/linux

regards,
Alexander Saprykin
https://v2.dental-soft.ru
Post Reply