2013-12-08 67 views
-5

我想使用ShellExecute,但它只是不想工作。我嘗試了很多來自其他論壇的東西,但我沒有找到合適的解決方案,因爲我不想使用System()!ShellExecute不工作C++

這裏是我的代碼的一部分:

void myClass::executeWMP() 
{ 
    ShellExecute(???); 
    cout << "\n"; 
} 

因爲我想從路徑執行的Windows Media Player開頭:

「C:\ Program Files文件(x86)的\ Windows媒體Player \ wmplayer.exe「

然後有人可以請解釋功能的參數?

*我使用的是Windows 7

+0

我很抱歉我的語法錯誤,我的第一語言不是英語! –

+0

好吧:所以我嘗試使用此:ShellExecute(HWND hwnd,LPCTSTR lpOperation,LPCTSTR lpFile,LPCTSTR lpParameters,LPCTSTR lpDirectory,nShowCmd);但我不知道我能如何放在路徑上,以及在哪裏。我不明白爲什麼我需要這六個參數。 –

+2

該文檔解釋了參數。你應該閱讀。 –

回答

1

我把它你指的是外殼從窗戶庫執行: http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx

ShellExecute(nullptr,L"open",L"C:\\Program Files (x86)\\Windows Media Player\\wmplayer.exe",nullptr,nullptr,SW_SHOW) 

第一個參數是窗口句柄,可以爲空。

第二個參數是對文件執行的操作。

第三個參數是指文件。

第四個參數是指打開文件時要改成什麼工作目錄,可以爲null。

第五個參數指的是什麼模式來打開文件/程序。

+0

謝謝!有用。但是如果我爲第二個參數輸入「open」,編譯器會說這個類型是不兼容的? –

+1

@HansPeter閱讀錯誤信息。它說的不僅僅是這些。它說這個函數需要LPCWSTR,但是你傳遞'char *'。所以做它說的。傳遞一個寬字符串:'L「打開」'。如果你不知道狹窄而寬廣的琴絃,請停止你正在做的事情並瞭解它們。最後,不要使用ShellExecute。使用'CreateProcess'。 –

+0

我明白了。 @David Heffernan是的,我想我不得不看看窄而寬的字符串,並嘗試CreateProcess,謝謝! –

3

如果你想運行特定的可執行文件,而不會在註冊表文件關聯方面,那麼你應該使用CreateProcess,不ShellExecute

LPCWSTR app = L"C:\\Program Files (x86)\\Windows Media Player\\wmplayer.exe"; 
PROCESS_INFORMATION pi; 
STARTUPINFO si = { sizeof si }; 
CreateProcessW(app, app, 0, 0, 0, 0, 0, 0, &si, &pi); 
CloseHandle(pi.hProcess); 
Closehandle(pi.hThread); 
+1

這是正確的。當然,'CreateProcess'中的參數甚至比'ShellExecute'多。並處理關閉。如果他不能調用'ShellExecute',那麼調用'CreateProcess'的希望渺茫。你的陳述的一個例外是當你需要用'runas'動詞強制提升時。 –

+0

謝謝,我也看到了這個功能,但David Kron的解決方案正在爲我工​​作! –

+0

@DavidHeffernan:謝謝。 –