0

我最近關於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); 
+1

IDE /編譯器版本對ShellExecute()的行爲沒有影響,因爲它是在OS層實現的Win32 API函數。這兩個版本都會調用相同的函數。在任何情況下,嘗試使用'ShellExecuteEx()'來代替它,它比'ShellExecute()'提供更準確的錯誤報告。還可以考慮用'NULL'替換''open''來調用默認操作,該操作可能不是「打開」,具體取決於您安裝的映像軟件。 –

+0

感謝您的評論。 試圖用NULL替換「open」,但結果相同。 將與ShellExecuteEx – Flavio

+0

嘗試與ShellExecuteEx,同樣的問題,返回成功,但它不會執行文件:( – Flavio

回答

0

好吧,看起來像我發現問題,確實很奇怪。也許是內存泄漏。 在ShellExecute/ShellExecuteEx調用之前,在循環(如成千上萬)中多次調用函數CreatePopupMenu()會導致此問題發生。 除非我們在ShellExecute調用之前使用DestroyMenu釋放HMENUs。 看起來像是某種內存泄漏也許,非常感謝你的答案。

+0

不是內存泄漏,_resource_泄漏。 – 1201ProgramAlarm

相關問題