Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / CreateProcess Передача - прием параметра через командную строку / 12 сообщений из 12, страница 1 из 1
29.05.2017, 23:07
    #39461878
Arbit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateProcess Передача - прием параметра через командную строку
Здравствуйте уважаемые Гуру!

В функции CreateProcess хочу в параметре командной строки передать
строковое значение std::string и принять его в приложении Win32
Но тип параметра cmd в CreateProcess - LPTSTR а в функции WinMain запускаемого процесса - LPSTR

Делаю так:
Код: plaintext
1.
2.
3.
4.
 string  PathSave = (string)Conf.FullPathDirProgrem() + "/update/" + FileName;
string  cmd = "update.exe";
_bstr_t  cmdLine = _bstr_t(cmd.c_str());
CreateProcess(p, cmdLine, NULL, NULL, FALSE, NULL, NULL, NULL, &cif, &pi);


В запускаемом процессе:
Код: plaintext
1.
2.
3.
4.
5.
6.
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE  hPrevInstance, LPSTR  lpCmdLine, int nCmdShow)
{
string str = (string)lpCmdLine;
MessageBox(NULL, _bstr_t(str.c_str()), L"Inform", MB_OK);
return 0:
}


Процесс запускается все отрабатывает, но параметр не принимает
В MessageBox пустое окно
но если передать не "update.exe" а с кирилицей, например "Привет update.exe" и обязательно с пробелом
Код: plaintext
1.
2.
3.
string  cmd = "Привет update.exe"; //c пробелом!
_bstr_t  cmdLine = _bstr_t(cmd.c_str());
CreateProcess(p, cmdLine, NULL, NULL, FALSE, NULL, NULL, NULL, &cif, &pi);


То в окне - получаю "update.exe"
Что во что преобразовывать?

Подскажите пожалуйста.
Всем заранее благодарен
...
Рейтинг: 0 / 0
29.05.2017, 23:11
    #39461879
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateProcess Передача - прием параметра через командную строку
Arbit,

Понимаем разницу между юникодными строками, анси и BSTR_T

Еще параметрами Юникода при компиляции

Исправляем
...
Рейтинг: 0 / 0
29.05.2017, 23:22
    #39461885
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateProcess Передача - прием параметра через командную строку
Arbitа в функции WinMain запускаемого процесса - LPSTR
wWinMain - примените для начала

Код: plaintext
1.
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR  lpCmdLine, int nCmdShow)




второй момент - во втором параметре полезно продублировать вначале путь к exe
авторThe new process can use GetCommandLine to retrieve the entire command line. Console processes written in C can use the argc and argv arguments to parse the command line. Because argv[0] is the module name, C programmers generally repeat the module name as the first token in the command line.
...
Рейтинг: 0 / 0
30.05.2017, 12:00
    #39462144
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateProcess Передача - прием параметра через командную строку
ArbitЗдравствуйте уважаемые Гуру!

В функции CreateProcess хочу в параметре командной строки передать
строковое значение std::string и принять его в приложении Win32
Но тип параметра cmd в CreateProcess - LPTSTR а в функции WinMain запускаемого процесса - LPSTR

Делаю так:
[src C++]
string PathSave = (string)Conf.FullPathDirProgrem() + "/update/" + FileName;
string cmd = "update.exe";
_bstr_t cmdLine = _bstr_t(cmd.c_str());



_bstr_t -- лишний. Не нужен от слова "СОВСЕМ".

LPTSTR -- это не тип, а синоним типа. Указатель на TCHAR .
А TCHAR -- это либо char, либо wchar_t, в зависимости от конфигурации программы
(макросы UNUCODE, MBCS, или ничего).

Тебе сначала нужно решить, какую конфигурацию использовать.
...
Рейтинг: 0 / 0
30.05.2017, 13:24
    #39462263
Arbit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateProcess Передача - прием параметра через командную строку
Изопропил, рад встрече!

Попробовал bpvtybnm в WinMain параметр LPWSTR
Код: plaintext
1.
int APIENTRY wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR  lpCmdLine, int nCmdShow)


но компилятор пишет:
"error C2731: WinMain: функция не может быть перегружена"

В настройках компилятора у меня стоит "Использовать набор символов Юникода"

Мне непонятно почему для передачи используется LPTSTR а принимается LPSTR?
Какова логика?
...
Рейтинг: 0 / 0
30.05.2017, 14:20
    #39462326
Arbit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateProcess Передача - прием параметра через командную строку
MasterZiv, спасибо за желание помочь!

авторLPTSTR -- это не тип, а синоним типа. Указатель на TCHAR.
А TCHAR -- это либо char, либо wchar_t, в зависимости от конфигурации программы
(макросы UNUCODE, MBCS, или ничего).
То есть если у меня в настройках юникод,
То в CreateProcess идет строка wchar_t. Тогда как она может быть принята как LPSTR?
Растолкуйте пожалуйста для "особо одаренного" и не пинайте сильно
...
Рейтинг: 0 / 0
30.05.2017, 14:35
    #39462340
Arbit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateProcess Передача - прием параметра через командную строку
Изопропил, как всегда в десятку!
Все разрешилось дублированием пути во втором параметре CreateProcess, не меняя ничего в WinMain
Спасибо огромное!!! и успешного дня!
...
Рейтинг: 0 / 0
30.05.2017, 17:36
    #39462578
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateProcess Передача - прием параметра через командную строку
ArbitMasterZiv, спасибо за желание помочь!

авторLPTSTR -- это не тип, а синоним типа. Указатель на TCHAR.
А TCHAR -- это либо char, либо wchar_t, в зависимости от конфигурации программы
(макросы UNUCODE, MBCS, или ничего).
То есть если у меня в настройках юникод,
То в CreateProcess идет строка wchar_t. Тогда как она может быть принята как LPSTR?
Растолкуйте пожалуйста для "особо одаренного" и не пинайте сильно
Тогда у тебя CreateProcess превращается в CreateProcessW и LPTSTR
...
Рейтинг: 0 / 0
30.05.2017, 23:14
    #39462709
Arbit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateProcess Передача - прием параметра через командную строку
Siemargl, спасибо большое, все понял.
...
Рейтинг: 0 / 0
30.05.2017, 23:30
    #39462713
Arbit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateProcess Передача - прием параметра через командную строку
Изопропил, не сочти за труд пожалуйста.
Последний вопрос на эту тему.

Это я сделал автоматический апдейт к программе на С# со своего сервера на хостинге
Остался последний момент при перезагрузке приложения:
- В WinMain (update.exe )я передавал параметр для того чтобы выгрузить основное приложение
перед обновленияем необходимых файлов, в том числе и основного exe
- Теперь передаю параметр - flag из WinMain в CreateProcess программы С# чтобы при загрузке
удалила файл обновления.

Вопрос: как принять в С# этот флаг?
В модуле Program в функции Main() нет параметров?
Где его можно прочитать?
Спасибо
...
Рейтинг: 0 / 0
30.05.2017, 23:53
    #39462725
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateProcess Передача - прием параметра через командную строку
Arbit,

Код: c#
1.
Environment.CommandLine
...
Рейтинг: 0 / 0
31.05.2017, 00:19
    #39462740
Arbit
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
CreateProcess Передача - прием параметра через командную строку
Изопропил, спасибо большое!!!
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / CreateProcess Передача - прием параметра через командную строку / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]