我最近關於Win32 API ShellExecute()
函數的項目中有一個奇怪的問題。ShellExecute返回成功,但不執行文件
該程序使用ANSI C模式下的Visual C++ 2015進行編譯。
int ret = (int)ShellExecuteA(0, "open", "C:\\Users\\Maverick\\stratum.jpg", NULL, NULL, SW_SHOWNORMAL);
printf("ShellExecute return value: %i\n", ret);
在上面的代碼中,ShellExecute()
返回42,所以它應該是成功的。但是,它並沒有真正打開文件。
我沒有特權問題,即使以管理員身份運行程序時也會出現同樣的問題。
其實,我可以成功運行該文件是這樣的:
system("C:\\Users\\Maverick\\stratum.jpg");
我不想被迫使用system()
,雖然。
此外,在將項目遷移到較新的Visual Studio之前,我使用的是Visual C++ 6.0,並且代碼工作正常。
任何線索可能是什麼問題?
編輯:ShellExecuteEx()
也返回成功(1),但不打開文件。
SHELLEXECUTEINFO ShExecInfo;
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = NULL;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "C:\\Users\\Maverick\\stratum.jpg";
ShExecInfo.lpParameters = NULL;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOWNORMAL;
ShExecInfo.hInstApp = NULL;
int ret = (int)ShellExecuteExA(&ShExecInfo);
IDE /編譯器版本對ShellExecute()的行爲沒有影響,因爲它是在OS層實現的Win32 API函數。這兩個版本都會調用相同的函數。在任何情況下,嘗試使用'ShellExecuteEx()'來代替它,它比'ShellExecute()'提供更準確的錯誤報告。還可以考慮用'NULL'替換''open''來調用默認操作,該操作可能不是「打開」,具體取決於您安裝的映像軟件。 –
感謝您的評論。 試圖用NULL替換「open」,但結果相同。 將與ShellExecuteEx – Flavio
嘗試與ShellExecuteEx,同樣的問題,返回成功,但它不會執行文件:( – Flavio