以ShellExecute()的方式Call執行檔的問題 |
尚未結案
|
dar
一般會員 發表:4 回覆:13 積分:3 註冊:2005-09-17 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
dar 妳好: 可能使用 CreateProcess 比較能符合妳的需求,請參考這兩篇討論文章:
shellExecute執行外部程式後如何讓原來的程式先暫停阿
http://delphi.ktop.com.tw/topic.php?topic_id=71111 用CreateProcess 怎麼截取輸出的結果阿
http://delphi.ktop.com.tw/topic.php?topic_id=71374
站上的資源很豐富,如果上述資訊不敷妳所需,可以透過站上提供的搜尋功能來找尋更多的參考資訊,妳可以試著使用 ShellExecute DOS BCB 為關鍵字來找尋相關討論。 7 天天敲鍵盤 v 時時按滑鼠 8
|
dar
一般會員 發表:4 回覆:13 積分:3 註冊:2005-09-17 發送簡訊給我 |
很謝謝版主這麼快回覆我
><見諒我是bcb初學者,能否告之CreateProcess跟ShellExecute()主要的差異在哪呢
我有自行用練習了一下ShellExecute()
如下
ezw.exe此壓縮程式在dos下key in的參數格式為:ezw.exe "input的圖檔名稱"
根劇ShellExecute()的語法,我把此參數key in在第四個位置(input的圖檔名稱=1)可是為什麼沒輸出壓縮過後的圖片呢?
ShellExecute(0, "Open","H:\\ezw.exe", "1", "0", SW_SHOW); sorry我基本的還不是很懂><
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
dar 妳好: 這種問題通常是路徑的問題,我不清楚妳描述的那支程式是如何運作的 (參數有那些、與檔案有關的參數會不會解析路徑資料....),因此難以直接回答妳的問題,如果要確保程式運作正常的話,就將程式執行時的環境設定成與 DOS 視窗內執行的相同 (執行時的路徑、圖檔的名稱....),如果兩者環境相同,而在 DOS 視窗中能正確的產生壓縮後的圖檔,那麼在程式中呼叫執行也應該會產生的。 至於 CreateProcess() 與 ShellExecute() 的主要差異,大概是在於 ShellExecute 使用起來較為簡單,但是靈活性會較差些,同時 CreateProcess 可取得被執行程式實際的 Handle 值,在某些運用上會比較實用,當然兩者的差異不只如此而已,如果想進一步瞭解兩者的其它差異處,妳可以查看一下 Help 的說明與站上的相關討論。 7 天天敲鍵盤 v 時時按滑鼠 8
|
dar
一般會員 發表:4 回覆:13 積分:3 註冊:2005-09-17 發送簡訊給我 |
因為手上的壓縮程式(ezw.exe)只能在dos模式下執行,而在dos模式下又需要keyin參數才能得到一個圖檔的檔案。
e.g. C:\\ezw.exe picname outpath outname
所以才想說用bcb先做一個bottom來call此壓縮程式,而後再把結果的圖show上去放。
不知道大大能否給我個方向,爬了好多文章~眼精好累@@
====================
我看之前的文章有這麼說到:
問:
請教一下
我的程式是先呼叫一個應用程式
應用程式會跑出dos視窗
必須先按『enter』
之後再打入要下的命令及參數
請問如何找到應用程式視窗及送出enter及參數給視窗? 答:
提供一法您且試試。
就是利用DOS的轉向功能來將輸入資料傳給執行的應用程式。
首先將程式執行時,所有要傳給該程式的資料(包含Enter)通通打在文字檔中並存檔(假設檔名為input.dat),最後把資料檔經由轉向的方式給應用程式(YourExe): c:\NowPath>YourExe < input.dat 如果上述的方式可行,再根據之前會員提供的方法,執行這段指令。
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
dar 妳好: 請妳做以下測試,然後將結果說明一下:
1. 開啟一個 DOS 視窗。 2. 在 C: 磁碟的根目錄建立三個暫存目錄,分別是 c:\test1、c:\test2 與 c:\test3。 3. 將 ezw.exe 檔案 (以及執行該程式需要用到的檔案)複製一份到 c:\test1 目錄內。 4. 將妳要處理的圖檔複製一份到 c:\test2 目錄內,檔案更名為 pic1.xxx (請注意!xxx 為妳要測試的圖檔類型,也就是保留該檔案原先的副檔名)。 5. 在 c:\ 根目錄下達下列的指令後按下 Enter 件執行它: c:\test1\ezw.exe c:\test2\pic1.xxx c:\test3 pic2.xxx 6. 上述指令執行完畢後,請查看 c:\test3 目錄內是否存在壓縮過後的 pic2.xxx 檔案?7 天天敲鍵盤 v 時時按滑鼠 8 |
dar
一般會員 發表:4 回覆:13 積分:3 註冊:2005-09-17 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
dar 妳好: 因為我這邊沒有那支 ezw.exe 程式,無法做相關測試,所以要先請妳做一個簡單的測試,以確認那支程式是否能正確的處理含路徑資料在內的檔名? 既然已經釐清了疑點,那麼我就可以提供比較切確的範例供妳參考了:
UINT Result; bool err = false; DWORD dwExitCode; STARTUPINFO StartupInfo = {0}; PROCESS_INFORMATION ProcessInfo; ZeroMemory(&StartupInfo, sizeof(StartupInfo)); StartupInfo.cb = sizeof(STARTUPINFO); StartupInfo.wShowWindow = SW_HIDE; AnsiString cmd = getenv("COMSPEC"); AnsiString prog = "c:\\test1\\ezw.exe"; AnsiString picname = "c:\\test2\\pic1.xxx"; AnsiString outpath = "c:\\test3"; AnsiString outname = "pic2.xxx"; AnsiString target = outpath "\\" outname; AnsiString cmdline = cmd " /c " prog " " picname " " outpath " " outname; Result = CreateProcess(NULL, cmdline.c_str(), NULL, NULL, false, 0, NULL, NULL, &StartupInfo, &ProcessInfo); if (Result) { CloseHandle(ProcessInfo.hThread); if (WaitForSingleObject(ProcessInfo.hProcess, INFINITE) != WAIT_FAILED) { GetExitCodeProcess(ProcessInfo.hProcess, &dwExitCode); } CloseHandle(ProcessInfo.hProcess); if (FileExists(target)) { Image1->Picture->Bitmap->LoadFromFile(target); } else { err = true; } } else { err = true; } if (err) ShowMessage(target " not found!");範例中以紅色標示的字串值請按妳實際的狀況來設定,同時我也要再次強調,以上範例我並不確定可以正確執行,因為我沒有那隻 ezw.exe 程式,因此請妳測試後將結果告知。 7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/09/20 16:39:28 |
dar
一般會員 發表:4 回覆:13 積分:3 註冊:2005-09-17 發送簡訊給我 |
回版大:
首先真的真的很抱歉~因為我誤以為你上例叫我做的test只是想知道那程式是否ok的~所以我沒去真的試><,不過當你回說想知道「以確認那支程式是否能正確的處理含路徑資料在內的檔名?」我才大悟你的用意,所以我照你的意思趕緊試了一下,原來......不行含路徑資料在內的檔名。但是一看到你所給我的程式時,我照了你的模式自己改了一下,泣............感動...真的有輸出圖產生了><,但是卻不能顯示在image1上面~只有檔案圖檔產生,因為一按buttom的話它顯示:
http://www2.cyut.edu.tw/~s9127104/bcb.JPG
修改的程式如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
UINT Result;
bool err = false;
DWORD dwExitCode;
STARTUPINFO StartupInfo = {0};
PROCESS_INFORMATION ProcessInfo; ZeroMemory(&StartupInfo, sizeof(StartupInfo));
StartupInfo.cb = sizeof(STARTUPINFO);
StartupInfo.wShowWindow = SW_HIDE;
AnsiString cmd = getenv("COMSPEC"); AnsiString prog = "c:\\CJPEG.EXE";
AnsiString picname = "c:\\inputpic.bmp";
AnsiString outpath = "c:\\";
AnsiString outname = "inputpic.jpg";
AnsiString target = outpath outname; AnsiString cmdline = cmd " /c " prog " " picname ; Result = CreateProcess(NULL, cmdline.c_str(), NULL, NULL, false, 0, NULL, NULL, &StartupInfo, &ProcessInfo); if (Result) {
CloseHandle(ProcessInfo.hThread);
if (WaitForSingleObject(ProcessInfo.hProcess, INFINITE) != WAIT_FAILED) {
GetExitCodeProcess(ProcessInfo.hProcess, &dwExitCode);
} CloseHandle(ProcessInfo.hProcess); if (FileExists(target)) {
Image1->Picture->Bitmap->LoadFromFile(target);
} else {
err = true;
}
} else {
err = true;
} if (err) ShowMessage(target " not found!");
}
其實我真的想處理的程式是這一隻 http://www2.cyut.edu.tw/~s9127104/CJPEG.EXE 不過這跟ezw的差不多,參數keyin的格式==> C:\\CJPEG inputpic.bmp (其實裡面還有很多參數可以設定~)
這樣的話輸出的圖名稱也會跟輸入一樣為inputpic.jpg,而執行時我將CJPEG.EXE、圖inputpic.bmp放在c:,所以輸出圖也產生在c: 感謝~請大大指教 發表人 - dar 於 2005/09/20 23:57:48
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
dar 妳好: 再試試看修改後的程式碼:
// 要處理 JPEG 檔案必須要引入下列檔案 #include7 天天敲鍵盤 v 時時按滑鼠 8 |
dar
一般會員 發表:4 回覆:13 積分:3 註冊:2005-09-17 發送簡訊給我 |
|
RedSnow
版主 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
dar 妳好: 以下程式碼加上了透過 FindFirst() 來取得檔案大小的動作,同時也加上了不顯示 DOS 視窗的設定,請妳視個人需求來決定是否要啟用該行設定?
UINT Result; bool err = false; DWORD dwExitCode; STARTUPINFO StartupInfo = {0}; PROCESS_INFORMATION ProcessInfo; TSearchRec Sr; // 供取得檔案資訊之用 (此處主要是要用來取得檔案大小) ZeroMemory(&StartupInfo, sizeof(StartupInfo)); StartupInfo.cb = sizeof(STARTUPINFO); StartupInfo.wShowWindow = SW_HIDE; StartupInfo.dwFlags = STARTF_USESHOWWINDOW; // 本行設定可在呼叫 DOS 程式時不顯示出 DOS 視窗,如果想顯示出 DOS 視窗以觀察程式執行時的相關訊息就刪除掉本行 AnsiString cmd = getenv("COMSPEC"); AnsiString prog = "c:\\tmp\\cjpeg.exe"; AnsiString picname = "c:\\test.bmp"; AnsiString outpath = "c:\\"; AnsiString outname = "test.jpg"; AnsiString target = outpath outname; AnsiString cmdline = cmd " /c " prog " " picname; if (FindFirst(picname, faAnyFile, Sr) == 0) { Edit1->Text = IntToStr(Sr.Size); // 顯示轉換前 BMP 圖檔的大小 FindClose(Sr); if (FileExists(target)) { DeleteFile(target); // 避免檔案已存在,而顯示出是否要覆蓋掉的詢問訊息 } Result = CreateProcess(NULL, cmdline.c_str(), NULL, NULL, false, 0, NULL, NULL, &StartupInfo, &ProcessInfo); if (Result) { CloseHandle(ProcessInfo.hThread); if (WaitForSingleObject(ProcessInfo.hProcess, INFINITE) != WAIT_FAILED) { GetExitCodeProcess(ProcessInfo.hProcess,&dwExitCode); } CloseHandle(ProcessInfo.hProcess); if (FileExists(target)) { if (FindFirst(target, faAnyFile, Sr) == 0) { Edit2->Text = IntToStr(Sr.Size); // 顯示轉換後 JPG 圖檔的大小 FindClose(Sr); } TJPEGImage *JPEG; JPEG = new TJPEGImage; JPEG->LoadFromFile(target); Image1->Picture->Bitmap->Assign(JPEG); delete JPEG; JPEG = NULL; }else{ err = true; } } else { err = true; } if (err) ShowMessage(target " not found!"); } else { ShowMessage(picname " not found!"); }7 天天敲鍵盤 v 時時按滑鼠 8 發表人 - RedSnow 於 2005/09/21 11:56:44 |
dar
一般會員 發表:4 回覆:13 積分:3 註冊:2005-09-17 發送簡訊給我 |
|
wardrobe
一般會員 發表:8 回覆:5 積分:2 註冊:2006-07-24 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |