ShellExecute的功能是運(yùn)行一個(gè)外部程序(或者是打開(kāi)一個(gè)已注冊(cè)的文件、打開(kāi)一個(gè)目錄、打印一個(gè)文件等等),并對(duì)外部程序有一定的控制。
有幾個(gè)API函數(shù)都可以實(shí)現(xiàn)這些功能,但是在大多數(shù)情況下ShellExecute是更多的被使用的,同時(shí)它并不是太復(fù)雜。下面舉例說(shuō)明它的用法。
開(kāi)始一個(gè)新的應(yīng)用程序
ShellExecute(Handle, ‘open‘, PChar(‘c:testapp.exe‘), nil, nil, SW_SHOW);
打開(kāi)記事本,并打開(kāi)一個(gè)文件(系統(tǒng)能識(shí)別記事本應(yīng)用程序的路徑,因此我們不必使用絕對(duì)路徑)
ShellExecute(Handle, ‘open‘, PChar(‘notepad‘), PChar(‘c:testreadme.txt‘), nil, SW_SHOW);
打印一個(gè)文檔
ShellExecute(Handle, ‘print‘, PChar(‘c:testtest.doc‘), nil, nil, SW_SHOW);
注意:可能你會(huì)看到word暫時(shí)的被打開(kāi),但它會(huì)自動(dòng)關(guān)閉。
打開(kāi)一個(gè)HTML頁(yè)面
ShellExecute(Handle, ‘open‘, PChar(‘http://www.festra.com/‘), nil, nil, SW_SHOW);
你能通過(guò)一個(gè)已經(jīng)注冊(cè)的文件類(lèi)型來(lái)打開(kāi)應(yīng)用程序
ShellExecute(Handle, ‘open‘, PChar(‘c:testreadme.txt‘), nil, nil, SW_SHOW);
用windows Explorer 打開(kāi)一個(gè)目錄
ShellExecute(Handle, ‘explore‘, PChar(‘c:windows)‘, nil, nil, SW_SHOW);
運(yùn)行一個(gè)DOS命令并立即返回
ShellExecute(Handle, ‘open‘, PChar(‘command.com‘), PChar(‘/c copy file1.txt file2.txt‘), nil, SW_SHOW);
運(yùn)行一個(gè)DOS命令并保持DOS窗口存在
ShellExecute(Handle, ‘open‘, PChar(‘command.com‘), PChar(‘/k dir‘), nil, SW_SHOW);
Top
3 樓mydo(侯佩|hopy|侯佩,偶滴人?。┗貜?fù)于 2006-02-12 12:17:15 得分 0
Delphi ShellExecute幫助翻譯 [原]
hunterfall
11:31 AM
ShellExecute
ShellExecute函數(shù)用于打開(kāi)或者打印一個(gè)指定的文件。指定的文件必須是可執(zhí)行文件或者文檔文件。
HINSTANCE ShellExecute(
HWND hwnd, // handle to parent window
LPCTSTR lpOperation, // pointer to string that specifies operation to perform
LPCTSTR lpFile, // pointer to filename or folder name string
LPCTSTR lpParameters, // pointer to string that specifies executable-file parameters
LPCTSTR lpDirectory, // pointer to string that specifies default directory
INT nShowCmd // whether file is shown when opened
)
* Params(參數(shù)解釋?zhuān)?br />
Hwnd
指定父窗口句柄。這個(gè)窗口接收工程產(chǎn)生的所有消息。例如:一個(gè)工程可以通過(guò)消息框報(bào)告錯(cuò)誤。
lpOperation
以一個(gè)以null結(jié)束的字符串描述操作的執(zhí)行。以下的操作字符串是有效的:
行號(hào) 參數(shù) 含義
1 “open” 函數(shù)打開(kāi)由lpFile指定的文件。這個(gè)文件必須是可執(zhí)行文件或者文檔文件。文件夾必須是可打開(kāi)的文件夾。
2 “print” 函數(shù)打印由lpFile指定的文件。這個(gè)文件應(yīng)該是文檔文件。如果指定的文件是可執(zhí)行文件,函數(shù)將以open的方式打開(kāi)這個(gè)文件。
3 “explore” 函數(shù)將搜索由lpFile指定的文件夾。
lpOperation參數(shù)如果為null,函數(shù)將以open的方式打開(kāi)由lpFile指定的文件。
lpFile
以一個(gè)null結(jié)束的字符串描述打開(kāi)或者打印指定的文件,或者打開(kāi)或者搜索指定的
文件夾。函數(shù)可以打開(kāi)一個(gè)指定的文件或者文件夾,也可以打印一個(gè)文檔文件。
lpParameters
如果lpFile指定的是一個(gè)可執(zhí)行文件,lpParameters以一個(gè)以null結(jié)束的字符串指定該執(zhí)行文件傳給應(yīng)用軟件的參數(shù)。
行號(hào) 參數(shù) 含義
1 SW_HIDE 隱藏這個(gè)窗體,并激活其他窗體。
2 SW_MAXIMIZE 最大化指定的窗體。
3 SW_MINIMIZE 最小化指定的窗體,并按順序激活最上層的窗體。
4 SW_RESTORE 激活并顯示窗體。如果窗體為最小化或者最大化,窗體恢復(fù)到原始大小和位置。應(yīng)用程序當(dāng)恢復(fù)一個(gè)最小化的窗體時(shí)將指定標(biāo)記。
5 SW_SHOW 以當(dāng)前的大小和位置激活并顯示窗體。
6 SW_SHOWDEFAULT
7 SW_SHOWMAXIMIZED 激活并最大化顯示窗體。
8 SW_SHOWMINIMIZED 激活并最小化現(xiàn)實(shí)窗體。
9 SW_SHOWMINNOACTIVE 最小化窗體,保持其激活狀態(tài)。
10 SW_SHOWNA 以當(dāng)前狀態(tài)顯示窗體,保持其激活狀態(tài)。
11 SW_SHOWNOACTIVATE 以當(dāng)前的大小和位置顯示窗體,并保持其激活狀態(tài)。
12 SW_SHOWNORMAL 激活并顯示一個(gè)窗體。如果窗體為最大化或者最小化,窗體恢復(fù)到原始的大小和位置。當(dāng)窗體第一次顯示的時(shí)候,應(yīng)用程序記錄標(biāo)記。
如果lpField指定的是一個(gè)文檔文件,lpParameters應(yīng)該為null。
lpDirectory
以一個(gè)以null結(jié)束的字符串指定文件開(kāi)始運(yùn)行的默認(rèn)目錄。
nShowCmd
如果lpField指定了一個(gè)可執(zhí)行文件,nShowCmd指定這個(gè)文件在被打開(kāi)時(shí)如何顯示。這個(gè)參數(shù)可以是以下值中的任何一個(gè):
如果lpField指定的是文檔文件,nShowCmd應(yīng)該為0。
* return Values(返回值)
如果函數(shù)執(zhí)行成功,返回值是已經(jīng)運(yùn)行的工程的實(shí)例句柄,或者動(dòng)態(tài)數(shù)據(jù)交換服務(wù)器應(yīng)用程序的句柄。
(具體返回值列表從略,請(qǐng)參考Delphi在線幫助)
* Remarks(注釋?zhuān)?br />
被lpFile參數(shù)指定的文件必須是一個(gè)可執(zhí)行文件或者文檔文件。如果文件是一個(gè)文檔文件,ShellExecute函數(shù)將根據(jù)lpOperation參數(shù)決定打開(kāi)或者打印這個(gè)文件。如果是可執(zhí)行文件,ShellExecute函數(shù)將打開(kāi)它,即使lpOperation參數(shù)被指定為printing。
你可以使用ShellExecute打開(kāi)活著搜索一個(gè)文件夾??梢允褂靡韵氯我庖环N方式打開(kāi)一個(gè)文件夾:
ShellExecute(handle, NULL, path_to_folder, NULL, NULL, SW_SHOWNORMAL);
或者
ShellExecute(handle, "open", path_to_folder, NULL, NULL, SW_SHOWNORMAL);
使用下面的調(diào)用搜索文件夾:
ShellExecute(handle, "explore", path_to_folder, NULL, NULL, SW_SHOWNORMAL)
如果lpOperation參數(shù)為null,函數(shù)將打開(kāi)由lpFile指定的文件。如果lpOperation參數(shù)為”open”或者”explore”,函數(shù)將強(qiáng)制打開(kāi)窗體或者資源管理器。
Top
4 樓mydo(侯佩|hopy|侯佩,偶滴人?。┗貜?fù)于 2006-02-12 12:17:43 得分 0
以上都是轉(zhuǎn)貼。Top
5 樓woshihuzi(我是胡子)回復(fù)于 2006-02-12 13:51:05 得分 0
希望高手們粘貼一些馬上能用的代碼,也好辨別真?zhèn)危?br />
例如具體調(diào)用的時(shí)候,該給那些參數(shù)?如果改變謝謝調(diào)用參數(shù),將會(huì)造成什么后果?等等。
且看上面某個(gè)轉(zhuǎn)帖中的一個(gè)例子:
ShellExecute(Handle, ‘open‘, PChar(‘command.com‘), PChar(‘/c copy file1.txt file2.txt‘), nil, SW_SHOW);
這句話,我放在一個(gè)簡(jiǎn)單對(duì)話框程序的OK按鈕的響應(yīng)函數(shù)里面,一編譯,出現(xiàn)5個(gè)錯(cuò)誤:
C:Documents and SettingsAdministrator桌面openwordopenwordDlg.cpp(231) : error C2065: ‘Handle‘ : undeclared identifier
C:Documents and SettingsAdministrator桌面openwordopenwordDlg.cpp(231) : error C2065: ‘PChar‘ : undeclared identifier
C:Documents and SettingsAdministrator桌面openwordopenwordDlg.cpp(231) : error C2015: too many characters in constant
C:Documents and SettingsAdministrator桌面openwordopenwordDlg.cpp(231) : error C2015: too many characters in constant
C:Documents and SettingsAdministrator桌面openwordopenwordDlg.cpp(231) : error C2065: ‘nil‘ : undeclared identifier
我雖然初學(xué)Vc,發(fā)帖子是向大家學(xué)習(xí)的,但我絕對(duì)不想以訛傳訛。因此,我雖然感謝每一位關(guān)注此貼的朋友,但是對(duì)于只是一位轉(zhuǎn)帖而不經(jīng)過(guò)自己親手驗(yàn)證的朋友發(fā)出呼吁:能否發(fā)一些自己認(rèn)為是正確的代碼?
Top
6 樓vcmute(淡入淡出)回復(fù)于 2006-02-12 14:01:58 得分 0
http://www.vckbase.com/document/viewdoc.asp?id=416Top
7 樓woshihuzi(我是胡子)回復(fù)于 2006-02-12 14:15:02 得分 0
關(guān)于執(zhí)行dos命令的問(wèn)題發(fā)問(wèn),請(qǐng)高手指導(dǎo):
執(zhí)行之后,馬上返回:
ShellExecute(NULL, "open", "command.com", "/c copy d:\test.txt d:\test2.txt", NULL, SW_SHOW);
功能正確。
執(zhí)行之后,保留dos窗口:
ShellExecute(NULL, "open", "command.com", "/k copy d:\test.txt d:\test2.txt", NULL, SW_SHOW);
功能正確,但是,保留下來(lái)的dos窗口會(huì)不斷地輸出“Invalid handle”
改為如下代碼之后,也不行:
ShellExecute(this->m_hWnd, "open", "command.com", "/k copy d:\test.txt d:\test2.txt", NULL, SW_SHOW);
功能正確,癥狀同上:
改為如下代碼之后,也不行:
ShellExecute(this->GetSafeHwnd(), "open", "command.com", "/k copy d:\test.txt d:\test2.txt", NULL, SW_SHOW);
難道說(shuō),執(zhí)行DOS命令之后,留下的dos窗口總會(huì)輸出Invalid handle嗎?
Top
8 樓woshihuzi(我是胡子)回復(fù)于 2006-02-12 14:23:49 得分 0
又問(wèn):
同樣是打開(kāi)空記事本的功能,下述三個(gè)語(yǔ)句在細(xì)節(jié)上有何不同?
ShellExecute(NULL, "open", "notepad", NULL, NULL, SW_SHOWMAXIMIZED );
ShellExecute(this->m_hWnd, "open", "notepad", NULL, NULL, SW_SHOWMAXIMIZED );
ShellExecute(this->GetSafeHwnd(), "open", "notepad", NULL, NULL, SW_SHOWMAXIMIZED );
Top
9 樓woshihuzi(我是胡子)回復(fù)于 2006-02-12 14:42:56 得分 0
問(wèn):
mydo(坎道斯|Kinds) 老兄說(shuō),ShellExecute函數(shù)可以打開(kāi)一個(gè)HTML頁(yè)面,
我用了如下的語(yǔ)句:
ShellExecute(NULL, "‘open", "http://www.sina.com.cn", NULL, NULL, SW_SHOW);
ShellExecute(NULL, "‘open", ""http://www.sina.com.cn"", NULL, NULL, SW_SHOW);
發(fā)現(xiàn)都不行。
這是為什么呢?Top
10 樓ncucf(ncu晨風(fēng))回復(fù)于 2006-02-12 14:45:48 得分 0
ShellExecute(NULL, "open", "notepad", NULL, NULL, SW_SHOWMAXIMIZED );
ShellExecute(this->m_hWnd, "open", "notepad", NULL, NULL, SW_SHOWMAXIMIZED );
ShellExecute(this->GetSafeHwnd(), "open", "notepad", NULL, NULL, SW_SHOWMAXIMIZED );
第一個(gè)參數(shù)是設(shè)置 父窗口句柄,設(shè)不設(shè)置關(guān)系不大!
你第二句和第三句沒(méi)多大區(qū)別,getsafehwnd()要安全一些,因?yàn)橛袝r(shí)候m_hwnd可能是無(wú)效的!
你說(shuō)得dos總是輸出invalid handle,沒(méi)什么辦法,你可以用管道把踏重定向掉!
Top
11 樓woshihuzi(我是胡子)回復(fù)于 2006-02-12 14:53:29 得分 0
謝謝 ncucf(ncu晨風(fēng)) ,這樣的解釋是我最需要的。
剛才打開(kāi)網(wǎng)頁(yè)的語(yǔ)句有個(gè)錯(cuò)誤,"open"給我寫(xiě)成"‘open"了,現(xiàn)在改過(guò)來(lái),發(fā)現(xiàn):
如下6種打開(kāi)方式都是可以的:
ShellExecute(NULL, "open", "http://www.sina.com.cn", NULL, NULL, SW_SHOW);
ShellExecute(NULL, "open", "http://www.google.com", "", "", SW_SHOW);
我們把第一個(gè)參數(shù)換成this->m_hWnd和this->GetSafeHwnd(),則得到另外4種方法。
Top
12 樓woshihuzi(我是胡子)回復(fù)于 2006-02-12 15:12:01 得分 0
關(guān)于打開(kāi)網(wǎng)頁(yè)窗口的問(wèn)題:
ShellExecute(NULL, "open", "http://www.google.com", NULL, NULL, SW_SHOW);
這個(gè)語(yǔ)句可以打開(kāi)一個(gè)瀏覽器窗口,顯示網(wǎng)頁(yè)http://www.google.com,
但是它有個(gè)缺點(diǎn):
它不會(huì)重新打開(kāi)一個(gè)新的瀏覽器窗口,
總是把以前最后打開(kāi)的那一個(gè)瀏覽器窗口的內(nèi)容重定向成http://www.google.com
請(qǐng)問(wèn)有什么辦法讓http://www.google.com在打開(kāi)的時(shí)候,
不覆蓋掉現(xiàn)有的任何一個(gè)打開(kāi)的網(wǎng)頁(yè)呢?
Top
13 樓woshihuzi(我是胡子)回復(fù)于 2006-02-12 16:00:28 得分 0
////////////////////////////////////////////////////////////////
//
// 功能:
// 利用默認(rèn)瀏覽器在新窗口中打開(kāi)網(wǎng)頁(yè)
//
// 作者:
// 依星(airen3339@163.com)
//
// 日期:
// 2005.12
//
// 來(lái)源:
// http://www.jnhyw.com/estar/software/MyHtml.rar
//
// woshihuzi加了部分代碼
//
////////////////////////////////////////////////////////////////
void CMyFilePath::OpenUrlWithDefaultBrowserInNewWindow(CString sURL, bool bMaximize)
{
HKEY hkRoot,hSubKey; //定義注冊(cè)表根關(guān)鍵字及子關(guān)鍵字
char ValueName[256];
unsigned char DataValue[256];
unsigned long cbValueName=256;
unsigned long cbDataValue=256;
char ShellChar[256]; //定義命令行
DWORD dwType;
//打開(kāi)注冊(cè)表根關(guān)鍵字
if(RegOpenKey(HKEY_CLASSES_ROOT,NULL,&hkRoot)==ERROR_SUCCESS)
{
//打開(kāi)子關(guān)鍵字
if(RegOpenKeyEx(hkRoot,
"htmlfile\shell\open\command",
0,
KEY_ALL_ACCESS,
&hSubKey)==ERROR_SUCCESS)
{
//讀取注冊(cè)表,獲取默認(rèn)瀏覽器的命令行
RegEnumValue(hSubKey,
0,
ValueName,
&cbValueName,
NULL,
&dwType,
DataValue,
&cbDataValue);
// 調(diào)用參數(shù)(主頁(yè)地址)賦值
strcpy(ShellChar,(char *)DataValue);
strcat(ShellChar,sURL);
// 啟動(dòng)瀏覽器
int nShowCmd;
if (bMaximize) // 是否窗口最大化
nShowCmd = SW_MAXIMIZE;
else
nShowCmd = SW_SHOWNORMAL;
WinExec(ShellChar, nShowCmd);
}
else
{
//關(guān)閉注冊(cè)表
RegCloseKey(hSubKey);
RegCloseKey(hkRoot);
}
}
}Top
14 樓baggio_zyj()回復(fù)于 2006-02-13 16:09:10 得分 0
回復(fù) woshihuzi(我是胡子)
關(guān)于打開(kāi)網(wǎng)頁(yè)窗口的問(wèn)題:
ShellExecute(NULL, "open", "http://www.google.com", NULL, NULL, SW_SHOW);
這個(gè)語(yǔ)句可以打開(kāi)一個(gè)瀏覽器窗口,顯示網(wǎng)頁(yè)http://www.google.com,
但是它有個(gè)缺點(diǎn):
它不會(huì)重新打開(kāi)一個(gè)新的瀏覽器窗口,
總是把以前最后打開(kāi)的那一個(gè)瀏覽器窗口的內(nèi)容重定向成http://www.google.com
請(qǐng)問(wèn)有什么辦法讓http://www.google.com在打開(kāi)的時(shí)候,
不覆蓋掉現(xiàn)有的任何一個(gè)打開(kāi)的網(wǎng)頁(yè)呢?
可以采用下面的方法:
ShellExecute(Handle,"open","IEXPLORE.EXE",url_address,NULL,showmode);Top
15 樓huwei001982(編程浪子)回復(fù)于 2006-02-13 16:33:18 得分 0
請(qǐng)問(wèn)有什么辦法讓http://www.google.com在打開(kāi)的時(shí)候,
不覆蓋掉現(xiàn)有的任何一個(gè)打開(kāi)的網(wǎng)頁(yè)呢?
---------
ShellExecute(NULL, NULL, "explorer", "http://www.google.com", NULL, SW_SHOW);
Top
16 樓TurkeyTangYu(嘯傲江湖)回復(fù)于 2006-02-13 16:34:43 得分 0
MARK
Top
17 樓woshihuzi(我是胡子)回復(fù)于 2006-02-13 21:18:05 得分 0
baggio_zyj() 的辦法,使用下面語(yǔ)句試驗(yàn)過(guò):
ShellExecute(NULL,"open","IEXPLORE.EXE","http://www.163.com",NULL,SW_SHOW);
發(fā)現(xiàn)能行,不過(guò)有一點(diǎn),我懷疑:
萬(wàn)一用戶的機(jī)子上偏偏就沒(méi)有裝IE瀏覽器,這個(gè)語(yǔ)句是不是還能有效?
我的機(jī)子沒(méi)有權(quán)限,不好卸載IE,還請(qǐng)有條件的高手幫忙驗(yàn)證一下哈。Top
18 樓woshihuzi(我是胡子)回復(fù)于 2006-02-13 21:24:46 得分 0
huwei001982(編程浪子)的做法,我用如下兩種語(yǔ)句實(shí)驗(yàn):
ShellExecute(NULL,NULL,"explorer","http://www.google.com",NULL,SW_SHOW);

ShellExecute(this->GetSafeHwnd(),NULL,"explorer","http://www.google.com",NULL,SW_SHOW);
發(fā)現(xiàn)彈出來(lái)的頁(yè)面總是躲在當(dāng)前對(duì)話框應(yīng)用程序主窗口的后面,有沒(méi)有辦法讓它出現(xiàn)在屏幕最頂端呢?
Top
19 樓woshihuzi(我是胡子)回復(fù)于 2006-02-13 21:25:09 得分 0
另外,我發(fā)現(xiàn),調(diào)用ShellExecute()函數(shù)打開(kāi)網(wǎng)頁(yè)的時(shí)候,把最后一個(gè)參數(shù)換成SW_SHOWMAXIMIZED好像不起作用,我記得打開(kāi)文件或者文件夾的時(shí)候,這個(gè)參數(shù)就起作用的。我能能否想想辦法,讓網(wǎng)頁(yè)一打開(kāi)就是最大化的呢?
Top
20 樓vcmute(淡入淡出)回復(fù)于 2006-02-13 21:43:22 得分 0
>另外,我發(fā)現(xiàn),調(diào)用ShellExecute()函數(shù)打開(kāi)網(wǎng)頁(yè)的時(shí)候,把最后一個(gè)參數(shù)換成SW_SHOWMAXIMIZED好像不起作用,我記得打開(kāi)文件或者文件夾的時(shí)候,這個(gè)參數(shù)就起作用的。我能能否想想辦法,讓網(wǎng)頁(yè)一打開(kāi)就是最大化的呢?
第一個(gè)參數(shù)設(shè)置為NULLTop
21 樓woshihuzi(我是胡子)回復(fù)于 2006-02-13 22:14:21 得分 0
試圖最大化打開(kāi)網(wǎng)頁(yè),三個(gè)不行的語(yǔ)句,一個(gè)行的語(yǔ)句(最后一個(gè))。
// ShellExecute(NULL, "open", "http://www.google.com", NULL, NULL, SW_SHOWMAXIMIZED);
// ShellExecute(NULL, NULL, "explorer", "http://www.google.com", NULL, SW_SHOWMAXIMIZED);
// ShellExecute(NULL, "open", "explorer", "http://www.google.com", NULL, SW_SHOWMAXIMIZED);
ShellExecute(NULL, "open", "IEXPLORE.EXE", "http://www.google.com", NULL, SW_SHOWMAXIMIZED);
就行的那個(gè)來(lái)看目前是各種語(yǔ)句當(dāng)中最好的,他只有一個(gè)缺點(diǎn),那就是:
如果用戶的機(jī)器上沒(méi)有IE瀏覽器,那它能不能執(zhí)行成功呢?Top
22 樓mydo(侯佩|hopy|侯佩,偶滴人啊)回復(fù)于 2006-02-14 08:54:12 得分 0
csdn 其他高手整理的,請(qǐng)參考:
http://community.csdn.net/Expert/topic/4264/4264100.xml?temp=.2540705Top
23 樓zhoujiamurong(有分俺就不要,俺要知識(shí))回復(fù)于 2006-04-18 13:35:38 得分 0
markTop
24 樓lfchen(一條晚起的蟲(chóng))回復(fù)于 2006-04-18 16:51:28 得分 0
ShellExecute(NULL, "open", "http://www.google.com", NULL, NULL, SW_SHOWMAXIMIZED);
firefox瀏覽器,正常。
愛(ài)華網(wǎng)本文地址 » http://www.klfzs.com/a/25101014/198203.html
愛(ài)華網(wǎng)


