2015-07-16 3 views
0

У меня возникли проблемы с использованием CreateProcess с аргументами командной строки. Я прочитал все сообщения, которые я нашел, но ни одно из решений не работало.Не удалось передать аргументы командной строки в CreateProcess

Вот что у меня есть:

std::string path = "C:\\my\\path\\myfile.exe"; 
std::wstring stemp = std::wstring(path.begin(), path.end()); 
LPCWSTR path_lpcwstr = stemp.c_str(); 

std::string params = " Param1 Param2 Param3"; 
STARTUPINFO info = { sizeof(info) }; 
PROCESS_INFORMATION processInfo; 
CreateProcess(path_lpcwstr, LPTSTR(params.c_str()), NULL, NULL, TRUE, CREATE_NEW_PROCESS_GROUP, NULL, NULL, &info, &processInfo); 

Код работает и myfile.exe (а QT приложение) открывается, но ARGC всегда 1. Я также попытался указать только первый параметр, как «C : \ my \ path \ myfile.exe Param1 Param2 Param3 ", но это тоже не сработало.

Любая помощь очень ценится.

Использование CreateProcessA и изменение параметров соответственно устраняет проблему, указанную одним из ответов.

STARTUPINFOA info = { sizeof(info) }; 
PROCESS_INFORMATION processInfo; 
std::string path = "C:\\my\\path\\myfile.exe"; 
std::string params = " Param1 Param2 Param3"; 
CreateProcessA(path.c_str(), const_cast<char *>(config.c_str()) , NULL, NULL, TRUE, CREATE_NEW_PROCESS_GROUP, NULL, NULL, &info, &processInfo); 
+1

C и C++ - ** разные ** языки! – Olaf

+0

Да, я знаю. Но вызов CreateProcess одинаковый как для C++, так и для C, поэтому я подумал, что я также использую C. Сожалею. – Androidicus

+0

@deviantfan да. «не совместим с параметром типа« LPWSTR »« – Androidicus

ответ

1

Есть две версии CreateProcess (и многие другие функции WinAPI тоже):

Берут "нормальные" строки в ASCII/ISO88591/независимо, где каждый символ имеет 1 байт.
"abc" будет иметь номера 97 98 99.

Другие CreateProcess принимает строки UTF16; каждый символ имеет 2 или 4 байта,
и «abc» будут иметь номера байтов 0 97 0 98 0 99
(UTF16 немного сложнее, но в этом случае это всего лишь 0 добавлено).
Преимуществом является улучшенная поддержка интернационализации, потому что
старые 1-байтовых кодировок проблематичными с языками, как русский, греческий и т.д.

You're, используя вторую версию. path_lpcwstr, т.е. путь и имя программы как первый параметр, правильно предоставлены вами как строка UTF16 (std::wstring на Windows и LPCWSTR и т. д.).

Однако второй параметр с аргументами для нового процесса - это не UTF16 в вашем коде (но однобайтная кодировка), и чтобы избежать ошибки компилятора, вы просто набрасываете указатель и говорите компилятору, чтобы он обрабатывал содержимое не-UTF16 как UTF16.
Байт параметра «Param1 Param2 Param3», который понимается как UTF16, не дает никакой разумной строки без правильного преобразования, и для начала, 2 байт 0 значение для завершения строки, как указано в Windows, нигде не существует , Результатом является неопределенное поведение, любые странные вещи могут случиться.

Сделайте строку параметров так, как вы делали с ней, и все должно быть хорошо.

+0

Привет, спасибо за ваш ответ.Это не работает, потому что CreateProcess ожидает, что LPSTR будет вторым параметром (не LPCWSTR). Поэтому я не могу преобразовать аргумент 1 из LPCWSTR в LPSTR. Есть идеи? – Androidicus

+0

ах ваш ответ привел меня на правильный путь. Я использовал CreateProcessA вместо CreateProcess, и теперь он работает. См. Отредактированные ответы. – Androidicus

0

Вы когда-нибудь пробовали ShellExecuteA()?

+0

Может быть полезно привести пример os ShellExecuteA()? – LenW

+0

Я пробую этот код, чтобы открыть файл изображения по окнам imageview \t QString picturePath = m_localFile; \t QString picturePara = QLatin1String ("shimgvw.dll ImageView_Fullscreen") + picturePath; \t picturePath.replace ("/", "\\"); \t picturePara.replace ("/", "\\"); \t ShellExecuteA (NULL, NULL, "rundll32.exe", \t \t picturePara.toUtf8() constData(), "C: \\ WINDOWS \\ system32", SW_SHOW.); – haris

Смежные вопросы