2013-05-20 1 views
1
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); 

Если файл-путь является файлом temp, загруженным из Интернета, ShellExecuteEx потерпит неудачу. Но если filepath является обычным именем файла, таким как «блокнот», он работает.Как отключить файл установки tempory?

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

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

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

ответ

1

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

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

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); 

Примечания нуля инициализации, так что мы можем опустить явное задание для участников, которые должны be NULL.

Смежные вопросы