Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
1

CreateProcess() - некорректно передаются параметры командной строки

09.02.2015, 16:57. Показов 2609. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пытаюсь открыть файл через CreateProcess(), в параметрах прописал путь к программе которая будет открывать файл и путь к самому файлу. Но почему-то Блокнот открывает не тот файл, который я прописал в пути, а создаёт новый.
C++
1
2
3
4
5
6
7
8
9
10
11
STARTUPINFO cif;
ZeroMemory(&cif,sizeof(STARTUPINFO));
PROCESS_INFORMATION pi;
if(CreateProcess(L"C:\\windows\\notepad.exe",L"E:\\Sniffer\\Win32\\Release\\Log.txt", NULL, NULL, false, NULL, NULL, NULL, &cif,&pi))
{
    ShowMessage("Норм");       
 }      
else         
 {      
        ShowMessage(SysErrorMessage(GetLastError()));                 
}
Как делать так чтобы блокнот открывал именно тот файл, который я ему прописал в параметре функции?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2015, 16:57
Ответы с готовыми решениями:

Параметры командной строки CreateProcess
С Новым годом, здравствуйте. Возникло несколько вопросов по CreateProces. Имеется исполнимый...

Параметры командной строки в функции CreateProcess ();
Делаю так: STARTUPINFO cif;// структура ZeroMemory(&cif,sizeof(STARTUPINFO));// обнулить...

Не передаются параметры командной строки
У меня не передаются параметры командной строки, которые я устанавливаю в свойствах проекта. Чтобы...

Некорректно передаются параметры в поток
Возникла проблема : при создании потоков в 2-х вложенных циклах некорректно передаются параметры в...

14
Модератор
9256 / 6034 / 2379
Регистрация: 21.01.2014
Сообщений: 25,795
Записей в блоге: 3
09.02.2015, 17:16 2
Лучший ответ Сообщение было отмечено Sasha как решение

Решение

Ну, вот так как-то...
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::Button1Click(TObject *Sender)
{
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
  ZeroMemory( &si, sizeof(si) );
  si.cb = sizeof(si);
  ZeroMemory( &pi, sizeof(pi) );
  if(!CreateProcess(NULL, L"notepad.exe C:\\TEMP\\Unit1.txt",NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
    {
        ShowMessage(String().sprintf(L"CreateProcess failed (%d).", GetLastError()));
        return;
    }
    WaitForSingleObject( pi.hProcess, INFINITE );
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
09.02.2015, 19:17 3
Добавлю, что Unicode-версии функций CreateProcess могут модифицировать
аргумент, через который передается командная строка. Поэтому вместо
C
1
2
3
4
//
// Здесь L"MyCommandLine" - неизменяемая (read-only) строка.
//
CreateProcess(NULL, L"MyCommandLine", ...);
следует писать как-то так:
C
1
2
3
4
5
6
//
// А здесь, напротив, буфер CmdLine можно перезаписывать,
// поэтому нижеследующий фрагмент кода безопасен.
//
wchar_t CmdLine[] = {L"MyCommandLine"};
CreateProcess(NULL, CmdLine, ...);
2
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
09.02.2015, 23:31 4
Интересно только в чем эта модификация может заключаться, и чем может вылиться подстановка строковых типов с const_cast<>
C++
1
2
3
4
5
6
7
8
9
10
11
12
        
std::wstring  cmdLine_;
CreateProcess( appName_.empty()?   0: appName_.c_str(),
                                     cmdLine_.empty()? 0: const_cast<wchar_t*>(cmdLine_.c_str()), // ???
                                     &security_,
                                     &security_,
                                     true,
                                     priority_,
                                     0,
                                     currentDir_.empty()? 0: currentDir_.c_str(),
                                     &startupInfo_,
                                     &processInfo_);
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
10.02.2015, 00:02 5
Видел (в исходниках Win2K), что CreateProcessW на этапе разбора аргументов
временно ставит ноль между именем exe и остальной частью командной строки.
Судя по коду, чтобы "не заморачиваться" с выделением дополнительного буфера и
иметь возможность вызывать SearchPath, CreateFileW и другие функции для
различных проверок. Короче, передавать строковой литерал, как и любую другую
константную строку, в lpCommandLine чревато, и это легко проверяется и
явно обозначено в MSDN, кстати. Подчеркну: здесь речь идет именно о реальной
константности, т.е. когда передается read-only буфер. У std::string.c_str()
на известных мне реализациях C++ константность чисто формальная.

Ну а почему с CreateProcessA таких проблем нет ? Да потому, что она всего лишь
обертка над CreateProcessW (как и подавляющее большинство A-функций), которая
выделяет временные буферы на время вызова CreateProcessW и поэтому там
access violation не происходит.
3
Avazart
10.02.2015, 00:06
  #6

Не по теме:

Я просто видел в исходниках QProcess (Qt) там вообще кастуют в си стиле.

0
Убежденный
10.02.2015, 00:27
  #7

Не по теме:


Ну вряд ли разработчики Windows-бэкенда Qt настолько глупцы, чтобы не читать MSDN :)
Скорее всего, там ведь чисто "синтаксическая" константа. Я тоже видел, как string.c_str()
передается как read-write аргумент: это, хоть и вызывает легкий озноб, до AV не доводит.

0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
06.10.2015, 10:02  [ТС] 8
По ходу сделал вот так вот
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
           STARTUPINFO si;
    PROCESS_INFORMATION pi;
    ZeroMemory(&si, sizeof(si));
    si.cb = sizeof(si);
    ZeroMemory(&pi, sizeof(pi));
    wchar_t CmdLine[] = {L"/source=folder /pri=2 /path=C:\\DATA\"};
    if (!CreateProcess(NULL, CmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
    {
        ShowMessage(SysErrorMessage(GetLastError()));
        return;
    }
    WaitForSingleObject( pi.hProcess, INFINITE );
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
Но выдаёт ошибку

[bcc32 Error] Unit1.cpp(292): E2034 Cannot convert 'wchar_t[37]' to 'char *'
[bcc32 Error] Unit1.cpp(292): E2342 Type mismatch in parameter 'lpCommandLine' (wanted 'char *', got 'wchar_t *')

Использую XE4. Не могу понять, здесь, что конкретно надо char? Если да то почему wchar_t нельзя здесь использовать?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
06.10.2015, 10:54 9
В XE2 этот код прекрасно компилируется (если убрать лишний слеш из строки, разумеется)
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
06.10.2015, 11:10  [ТС] 10
volvo, где именно ты убрал лишний слешь?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
06.10.2015, 11:11 11
В 6-ой строке, последний слеш. Что, по подсветке не видно, что он просто экранирует кавычку? Ты либо его убери, либо еще один добавь, смотря что нужно.
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
06.10.2015, 11:21  [ТС] 12
Странно, убирал и добавлял эффект тот же
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
06.10.2015, 11:29 13
Значит, проверяй, что в настройке "_TCHAR maps to" в Project->Options->Directories and Conditionals. Если там выставлен char - то у меня выдает точно ту же ошибку, о которой ты говоришь. Поменяй на wchar_t и пересобери проект.
0
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.10.2015, 11:30 14

Не по теме:

Sasha,
А если пальцы в розетку в суть? Не пробовал? Может мозг включится? Любители потыкать наугад, блин ...



Добавлено через 1 минуту
Цитата Сообщение от Sasha Посмотреть сообщение
C++
1
wchar_t CmdLine[] = {L"/source=folder /pri=2 /path=C:\\DATA"};
Кстати что это?
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
06.10.2015, 18:51  [ТС] 15
volvo, спасибо, помогло

Не по теме:

Avazart, Хамить не обязательно!!!!!!!!!!!!!!!!!!!!

0
06.10.2015, 18:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.10.2015, 18:51
Помогаю со студенческими работами здесь

Параметры командной строки
Доброго времени. Необходимо для начала вывести все аргументы командной строки. Программа -...

Параметры командной строки
Подскажите пожалуйста, какие у лазаруса параметры командной строки и в какую папку складываются...

Параметры командной строки
Как можно реализовать в Python если ( script -r ) чтобы он выполнил одно и если ( script -s )...

Параметры командной строки
Добрый день, уважаемые Фортран-программисты! Столкнулся со следующей задачей: необходимо...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru