Page 1 of 1

wxExecute первый аргумент команды

Posted: Tue Apr 21, 2020 11:20 am
by AntonyTony
Как можно запустить .exe с аргументами команды?

Хорошо работает через wxExecute, но первый аргумент всегда равен названию приложения.

Code: Select all

	wxExecute("test.exe 4 72 54", wxEXEC_ASYNC);
Есть ли ещё способы открыть приложение и первый аргумент был равен 4 и т.д.
Пробовал делать через wxProcess::Open(), успехом не увенчался.

Re: wxExecute первый аргумент команды

Posted: Tue Apr 21, 2020 11:30 am
by T-Rex
Это стандартное поведение. В argv всегда первым аргументом приходит имя приложения.

Re: wxExecute первый аргумент команды

Posted: Tue Apr 21, 2020 11:51 am
by AntonyTony
T-Rex, Спасибо)
Тогда есть ли аналог CreateProcess на wx?
К примеру, я создаю процесс через стандартные методы WinAPI:

Code: Select all

::CreateProcess( "test.exe", "4 72 54", NULL, NULL, false, NORMAL_PRIORITY_CLASS, NULL, NULL, &StartInfo, &ProcInfo)
и в другом приложении получаю указатель на командную строку ( lpCmdLine ):

Code: Select all

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow)

P.S. Вполне справлюсь и с wxExecute, просто вопрос интересен

Re: wxExecute первый аргумент команды

Posted: Tue Apr 21, 2020 12:50 pm
by T-Rex
Ну, wxExecute, как я понимаю, внутри и работает через CreateProcess, там же WinAPI внутри, а не магия.

Вот, два варианта дают более-менее схожие результаты:

Code: Select all

		STARTUPINFO StartInfo = { sizeof(StartInfo) };
		PROCESS_INFORMATION ProcInfo;
		TCHAR arguments[] = L"test.exe 3 4 5";
		wchar_t command[] = L"test.exe";
		wchar_t args[] = L"3 4 5";

		wchar_t* params[] = { command, args, nullptr };
		wxExecute(params);
		
		::CreateProcess(L"test.exe", arguments, NULL, NULL, false, 
			NORMAL_PRIORITY_CLASS, NULL, NULL, &StartInfo, &ProcInfo);
С тестовым приложением:

Code: Select all

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{
    MessageBox(NULL, lpCmdLine, NULL, 0);
    return 0;
}