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

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
User avatar
cutecode
I live to help wx-kind
I live to help wx-kind
Posts: 181
Joined: Fri Dec 09, 2016 7:28 am
Contact:

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

Postby cutecode » Sat Feb 17, 2018 10:58 pm

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

Оказывается 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);


Неужели придется просить клиента не использовать пробелы в имени файла
regards,
Alexander Saprykin
www.wxwidgets.ru

User avatar
T-Rex
Moderator
Moderator
Posts: 1167
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

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

Postby T-Rex » Tue Feb 20, 2018 10:12 am

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: 2752
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

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

Postby ONEEYEMAN » Tue Feb 20, 2018 5:46 pm

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

Spasibo.

User avatar
cutecode
I live to help wx-kind
I live to help wx-kind
Posts: 181
Joined: Fri Dec 09, 2016 7:28 am
Contact:

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

Postby cutecode » Tue Feb 20, 2018 7:55 pm

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

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

и все прекрасно, ошибка исчезает
regards,
Alexander Saprykin
www.wxwidgets.ru

User avatar
cutecode
I live to help wx-kind
I live to help wx-kind
Posts: 181
Joined: Fri Dec 09, 2016 7:28 am
Contact:

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

Postby cutecode » Tue Feb 20, 2018 8:07 pm

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

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.
Для продолжения нажмите любую клавишу . . .
regards,
Alexander Saprykin
www.wxwidgets.ru

ONEEYEMAN
Part Of The Furniture
Part Of The Furniture
Posts: 2752
Joined: Sat Apr 16, 2005 7:22 am
Location: USA, Ukraine

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

Postby ONEEYEMAN » Tue Feb 20, 2018 8:24 pm

A primer exec otrabatyvaet?

User avatar
T-Rex
Moderator
Moderator
Posts: 1167
Joined: Sat Oct 23, 2004 9:58 am
Location: Zaporizhzhya, Ukraine
Contact:

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

Postby T-Rex » Wed Feb 21, 2018 9:08 am

В общем, там, наверное, проблема с 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
I live to help wx-kind
I live to help wx-kind
Posts: 181
Joined: Fri Dec 09, 2016 7:28 am
Contact:

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

Postby cutecode » Wed Feb 21, 2018 10:13 pm

Я "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, то серийника получить не могу

Ладно, работает и ладно.
regards,
Alexander Saprykin
www.wxwidgets.ru


Return to “wxWidgets Development (Russian)”

Who is online

Users browsing this forum: No registered users and 5 guests