全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:15202
推到 Plurk!
推到 Facebook!

以ShellExecute()的方式Call執行檔的問題

尚未結案
dar
一般會員


發表:4
回覆:13
積分:3
註冊:2005-09-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-09-19 02:33:36 IP:203.187.xxx.xxx 未訂閱
請問我有個已用c 編譯過的jpeg壓縮程式,我構想在bcb下以ShellExecute()的方式來呼叫執行此檔案,接著再將結果輸出來Image上。 問題1:這樣的話我怎麼以ShellExecute()的方式,來設定原來在dos下所需key in的參數呢?(如圖檔名稱路徑、...其它屬性) 問題2:再來我怎麼將壓縮過後的圖檔呈現在image1上呢? 希望大大能幫幫忙~感激不敬><
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-19 12:05:35 IP:59.115.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-09-19 17:23:23 IP:203.187.xxx.xxx 未訂閱
很謝謝版主這麼快回覆我 ><見諒我是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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-09-19 18:19:31 IP:61.230.xxx.xxx 未訂閱
dar 妳好:    這種問題通常是路徑的問題,我不清楚妳描述的那支程式是如何運作的 (參數有那些、與檔案有關的參數會不會解析路徑資料....),因此難以直接回答妳的問題,如果要確保程式運作正常的話,就將程式執行時的環境設定成與 DOS 視窗內執行的相同 (執行時的路徑、圖檔的名稱....),如果兩者環境相同,而在 DOS 視窗中能正確的產生壓縮後的圖檔,那麼在程式中呼叫執行也應該會產生的。    至於 CreateProcess() 與 ShellExecute() 的主要差異,大概是在於 ShellExecute 使用起來較為簡單,但是靈活性會較差些,同時 CreateProcess 可取得被執行程式實際的 Handle 值,在某些運用上會比較實用,當然兩者的差異不只如此而已,如果想進一步瞭解兩者的其它差異處,妳可以查看一下 Help 的說明與站上的相關討論。      7 天天敲鍵盤 v 時時按滑鼠 8
dar
一般會員


發表:4
回覆:13
積分:3
註冊:2005-09-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-09-19 19:29:32 IP:203.187.xxx.xxx 未訂閱
因為手上的壓縮程式(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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-09-19 23:38:37 IP:59.115.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-09-20 01:42:49 IP:203.187.xxx.xxx 未訂閱
回大大: 嗯~是有圖的 我想現在我最困惑的應該是,在dos下所需keyin的那些參數指令怎麼透過bcb來處理 ~現在打算先以最簡單的方式,用一個bottum即能得到結果圖(圖直接產生在原錄目就好了不處理) 真不好意思~一直麻煩版大^^"
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-09-20 16:29:00 IP:59.115.xxx.xxx 未訂閱
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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-09-20 23:38:08 IP:203.187.xxx.xxx 未訂閱
回版大: 首先真的真的很抱歉~因為我誤以為你上例叫我做的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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-09-21 00:44:04 IP:59.115.xxx.xxx 未訂閱
dar 妳好:    再試試看修改後的程式碼:
// 要處理 JPEG 檔案必須要引入下列檔案
#include     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:\\tmp\\cjpeg.exe";
AnsiString picname = "c:\\test.bmp";
AnsiString outpath = "c:\\";
AnsiString outname = "test.jpg";
//AnsiString target = outpath   "\\"   outname;  // 如果 outpath 結尾是目錄分隔符號的話,此處不可再加上 "\\" 符號
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)){
        // 要處理 JPEG 檔案必須要透過 TJPEGImage 來讀取,然後才交給 Image1 來顯示
        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!");
7 天天敲鍵盤 v 時時按滑鼠 8
dar
一般會員


發表:4
回覆:13
積分:3
註冊:2005-09-17

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-09-21 02:46:40 IP:203.187.xxx.xxx 未訂閱
哇哈哈哈哈哈~版大你好強丫 真的可以了耶,多謝你可以不厭其煩的教我這個超菜鳥,真是感動><",我學到了不少東西。 還有個問題就是有可以show出檔案大小的方法嗎 如:在輸入圖、輸出圖下面用個Edit1顯示出此pic的容量是幾kb
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-09-21 11:45:29 IP:61.230.xxx.xxx 未訂閱
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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-09-21 18:57:15 IP:203.187.xxx.xxx 未訂閱
^^我已經成功的應用完成了~這陣子多謝你的幫忙,在此受用不盡>< 往後有需要之處也希望大大多多指教
wardrobe
一般會員


發表:8
回覆:5
積分:2
註冊:2006-07-24

發送簡訊給我
#14 引用回覆 回覆 發表時間:2006-08-22 01:01:39 IP:125.229.xxx.xxx 未訂閱

dar您好,因為我急需要用到jpeg壓縮程式,希望你能傳給我您的壓縮程式借我參考,因為我剛接觸不久,我知道醬子可能不太好意思,但是我發表了很多程式問題,只是沒啥人回答,因為本來壓縮程式就很龐大,所以我已經深鎖眉頭很久了,希望能得到您的同意傳程式給我參考參考,謝謝,我的信箱:star90520@yahoo.com.tw

系統時間:2024-04-20 18:12:00
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!