Как правильно выполнить временный установочный файл?

SHELLEXECUTEINFO shExecInfo;

shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);

shExecInfo.fMask = NULL;
shExecInfo.hwnd = NULL;
shExecInfo.lpVerb = _T("runas");
shExecInfo.lpFile = filePath;
shExecInfo.lpParameters = NULL;
shExecInfo.lpDirectory = NULL;
shExecInfo.nShow = SW_MAXIMIZE;
shExecInfo.hInstApp = NULL;

ShellExecuteEx(&shExecInfo);

Если путь к файлу — это временный файл, загруженный из Интернета, ShellExecuteEx завершится ошибкой. Но если filepath — это обычное имя файла, такое как «блокнот», это работает.

Я пришел к выводу, что shellexecute нужно правильное имя расширения, но обычное приложение привилегий не может записать исполняемый файл в системный раздел, такой как c: \ users \ xxx \ local \ temp \ xxx.exe.

Код ошибки: ERROR_NO_ASSOCIATION.

Пожалуйста, помогите мне разрешить это противоречие.

1

Решение

Ошибка, которую система возвращает вам: ERROR_NO_ASSOCIATION, Хотя вы не заявили, что расширение filePath похоже, что это не так .exe,

Если бы вы переименовали загруженный файл, чтобы иметь расширение .exeзатем вызов ShellExecuteEx будет успешным. Это хакерский способ сделать это. Более чистым способом является использование lpClass член SHELLEXECUTEINFO struct, чтобы указать, что вы хотите, чтобы файл рассматривался как исполняемый файл. Вы можете сделать это, добавив следующее в ваш код:

shExecInfo.fMask = SEE_MASK_CLASSNAME;
shExecInfo.lpClass = _T("exefile");

Я бы написал ваш код так:

SHELLEXECUTEINFO shExecInfo = {0};
shExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
shExecInfo.fMask = SEE_MASK_CLASSNAME;
shExecInfo.lpVerb = _T("runas");
shExecInfo.lpFile = filePath;
shExecInfo.nShow = SW_MAXIMIZE;
shExecInfo.lpClass = _T("exefile");
ShellExecuteEx(&shExecInfo);

Обратите внимание на нулевую инициализацию, чтобы мы могли опустить явное назначение для членов, которые должны быть NULL,

1

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

Других решений пока нет …

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