winapi — команда CreateProcess переполнения стека

Команда CreateProcess С помощью команды WaitForSingleObject
можно открыть изображение?
Если да, как я могу открыть изображение?
Я пытался открыть, но я не знаю, где поставить путь, чтобы открыть

    if (CreateProcess(NULL, "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories\Paint.lnk", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
WaitForSingleObject(pi.hProcess, INFINITE);

CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}

-4

Решение

Если вы просто хотите открыть существующее изображение с помощью приложения defualt, используйте ShellExectue API. Например:

ShellExecuteW(NULL, L"open", L"Z:\\cat.PNG", NULL, NULL, SW_SHOW);

Вы также можете открыть изображение с помощью mspaint, используя тот же API:

ShellExecuteW(NULL, L"open", L"C:\\Windows\\system32\\mspaint.exe", L"Z:\\cat.PNG", NULL, SW_SHOW);

ShellExecuteEx позволит вам дождаться окончания процесса.

Вы можете сделать то же самое, используя CreateProcess. Как @DavidHeffernan указал второй параметр CreateProcess должен указывать на доступную для записи память, иначе это вызовет нарушение прав доступа. Чтобы было понятно, я просто опущу первый параметр. Пример:

STARTUPINFOW process_startup_info{ 0 };
process_startup_info.cb = sizeof(process_startup_info); // setup size of strcture in bytes

PROCESS_INFORMATION process_info{ 0 };

wchar_t commandline_args[] = L"\"C:\\Windows\\system32\\mspaint.exe\" Z:\\cat.PNG";

if (CreateProcessW(NULL, commandline_args, NULL, NULL, TRUE, 0, NULL, NULL, &process_startup_info, &process_info))
{
//WaitForSingleObject(process_info.hProcess, INFINITE); // uncomment to wait till process finish
CloseHandle(process_info.hProcess);
CloseHandle(process_info.hThread);
}

Я настоятельно рекомендую прочитать эта статья CodeProject (Элементарное руководство новичка по нерестовым процессам).

0

Другие решения

CreateProcess Функция может запускать только файлы .exe и .bat. использование ShellExecute[Ex] если хотите запускать файлы так же, как оболочка / проводник.

Процесс должен иметь PE EXE-файл в качестве основного файла, и если вы спросите CreateProcess чтобы начать что-то еще, он просто потерпит неудачу. ShellExecute будет искать расширение файла в реестре, чтобы найти правильный исполняемый файл (или COM-обработчик) для выполнения, и это часто заканчивается вызовом CreateProcess от вашего имени с файлом, который вы указали в качестве параметра командной строки.

С помощью ShellExecuteEx с SEE_MASK_NOCLOSEPROCESS флаг может быть может дать вам ручку процесса, на котором вы можете подождать, но вы также должны быть готовы к hProcess быть NULL. Это может произойти, если зарегистрированное приложение для типа файла уже запущено и DDE или COM был использован для открытия файла в этом существующем экземпляре приложения …

0

По вопросам рекламы [email protected]