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

如果文件路徑是從Internet下載的臨時文件,ShellExecuteEx會失敗。但是,如果filepath是「記事本」之類的普通文件名,則它可以工作。如何安裝臨時安裝程序文件?

我得出結論,shellexecute需要正確的擴展名,但正常的特權應用程序無法將可執行文件寫入系統部分,如c:\ users \ xxx \ local \ temp \ xxx.exe。

錯誤代碼是ERROR_NO_ASSOCIATION。

請幫我解決這個矛盾。

回答

1

系統返回給您的錯誤是ERROR_NO_ASSOCIATION。雖然你沒有說filePath有什麼擴展,它很可能是它不是.exe

如果您將下載的文件重命名爲擴展名爲.exe,那麼對ShellExecuteEx的調用將會成功。這是做這件事的方法。更簡潔的方法是使用SHELLEXECUTEINFO結構的lpClass成員指定您希望文件被視爲可執行文件。你可以通過添加以下到您的代碼:

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

相關問題