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.
Пожалуйста, помогите мне разрешить это противоречие.
Ошибка, которую система возвращает вам: 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
,
Других решений пока нет …