討論區快速選單
知識庫快速選單
傑米的攝影旅遊筆記 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
執行程式但要隱藏DOS視窗
更改我的閱讀文章字型大小
作者 : jazzyyang(小國)
[ 貼文 15 | 人氣 2753 | 評價 0 | 評價/貼文 0 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/2 上午 10:49:04
我的程式內容如下:
int WINAPI WinMain(HINSTANCE hInstance,
     HINSTANCE hPrevInstance,
     PSTR szCmdLine,
     int iCmdShow)
{
................................
system("HL");

}

我在compile完之後會將執行檔移到我要的目錄中,程式跑到最後要執行HL,HL畫面會出來沒錯,但是很討厭的就是背後還有一個DOS視窗在,要怎麼樣才能將它隱藏起來呢??
作者 : kagaya(kagaya) VC++優秀好手C++優秀好手貼文超過1000則人氣指數超過30000點
[ 貼文 1602 | 人氣 38709 | 評價 4610 | 評價/貼文 2.88 | 送出評價 115 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/2 上午 10:59:37
可以用FindWindow找到它
然後用ShowWindow藏起來
作者 : jazzyyang(小國)
[ 貼文 15 | 人氣 2753 | 評價 0 | 評價/貼文 0 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/2 下午 12:20:45
程式要怎麼寫?還是option要怎麼設?
作者 : sjohn0523(小約翰) VC++卓越專家貼文超過500則人氣指數超過10000點
[ 貼文 585 | 人氣 12261 | 評價 2690 | 評價/貼文 4.6 | 送出評價 42 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人jazzyyang註記此篇回應為最佳解答 2007/1/2 下午 12:40:38
>程式要怎麼寫?還是option要怎麼設?
system()是無法隱藏視窗的.
建議你使用CreateProcess

STARTUPINFO si;
PROCESS_INFORMATION pi;
GetStartupInfo(&si);
si.wShowWindow=SW_HIDE;
ZeroMemory( &pi,sizeof(pi));
CreateProcess(NULL,"HL",NULL,NULL,false,0,NULL,NULL,&si,&pi);
作者 : jazzyyang(小國)
[ 貼文 15 | 人氣 2753 | 評價 0 | 評價/貼文 0 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/2 下午 12:56:45
前面要include什麼??
要帶什麼.lib檔進來嗎??
作者 : sjohn0523(小約翰) VC++卓越專家貼文超過500則人氣指數超過10000點
[ 貼文 585 | 人氣 12261 | 評價 2690 | 評價/貼文 4.6 | 送出評價 42 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人jazzyyang註記此篇回應為很有道理 2007/1/2 下午 01:25:20
>前面要include什麼??
>要帶什麼.lib檔進來嗎??
基本上直接用就可以的..
有錯誤訊息說不認得此API才去查MSDN~
http://msdn2.microsoft.com/en-us/library/ms682425.aspx
最下方有Requirements..可以查出要include的h檔
作者 : jazzyyang(小國)
[ 貼文 15 | 人氣 2753 | 評價 0 | 評價/貼文 0 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/2 下午 01:35:32
搞定了,太感謝了!!
對了,我手上VC的書沒有介紹這些諸如:
STARTUPINFO,PROCESS_INFORMATION,GetStartupInfo,ZeroMemory,CreateProcess之類的
還有si.[很多選項]這些,
可否麻煩推薦一下那本VC的書對這些有詳加介紹的??
作者 : kagaya(kagaya) VC++優秀好手C++優秀好手貼文超過1000則人氣指數超過30000點
[ 貼文 1602 | 人氣 38709 | 評價 4610 | 評價/貼文 2.88 | 送出評價 115 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人jazzyyang註記此篇回應為很有道理 2007/1/2 下午 02:22:14
金禾有出
視窗設計函式庫 Win 32 API
共有上下兩冊
裡面就有你想找的東西
我也有買這兩本 覺得還不錯
作者 : shing819(Clier) VC++曠世奇才貼文超過1000則人氣指數超過30000點
[ 貼文 1740 | 人氣 40353 | 評價 8630 | 評價/貼文 4.96 | 送出評價 84 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人jazzyyang註記此篇回應為很有道理 2007/1/2 下午 10:48:02

>我的程式內容如下:
>int WINAPI WinMain(HINSTANCE hInstance,
> HINSTANCE hPrevInstance,
> PSTR szCmdLine,
> int iCmdShow)
>{
>................................
>system('HL');
>
>}
>
>我在compile完之後會將執行檔移到我要的目錄中,程式跑到最後要執行HL,HL畫面會出來沒錯,但是很討厭的就是背後還有一個DOS視窗在,要怎麼樣才能將它隱藏起來呢??



教你一個更簡單的方式,不須要使用太多參數,對初學者也不會造成困擾.

SHELLEXECUTEINFO info;
info.lpParameters = "HL";
ShellExecuteEx(&info);





作者 : mingyuan(yuan)
[ 貼文 79 | 人氣 4539 | 評價 110 | 評價/貼文 1.39 | 送出評價 10 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/4 上午 09:07:55
>SHELLEXECUTEINFO info;
   >info.lpParameters = "HL";
   >ShellExecuteEx(&info);


這個方式有個問題, 如果欲執行的程式是 Dos 版的 pkzip.exe , 要連續對 100 (maybe 1000 ) 個檔案( 任意檔案) 作壓縮 , 它不會一個檔壓縮完再壓縮下一個檔 , 它會連續 (感覺上變成同時) 壓縮數個檔, 直到記憶體不足.

    所以, 請問有沒有更好的方法 ?

作者 : kidaahuang(kidaa)
[ 貼文 31 | 人氣 4391 | 評價 30 | 評價/貼文 0.97 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/9 上午 09:53:31
>這個方式有個問題, 如果欲執行的程式是 Dos 版的 pkzip.exe , 要連續對 100 (maybe 1000 ) 個檔案( 任意檔案) 作壓縮 , 它不會一個檔壓縮完再壓縮下一個檔 , 它會連續 (感覺上變成同時) 壓縮數個檔, 直到記憶體不足.
>
> 所以, 請問有沒有更好的方法 ?

你是指你需要依序執行多個ShellExecuteEx去壓縮檔案嗎?
若是的話試試看以下

ShellExecuteEx(&info);
WaitForSingleObject(info.hProcess); // 等待Process執行完畢
作者 : mingyuan(yuan)
[ 貼文 79 | 人氣 4539 | 評價 110 | 評價/貼文 1.39 | 送出評價 10 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/10 下午 03:16:06
>ShellExecuteEx(&info);
>WaitForSingleObject(info.hProcess); // 等待Process執行完

 可否再請教 :
 因為執行檔是 pkzip.exe , 若欲被壓縮之檔案為 test.txt , 程式如下

SHELLEXECUTEINFO info;
info.lpVerb="pkzip";
info.lpParameters="test.txt";
ShellExecuteEx(&info);
WaitForSingleObject(info.hProcess,0);

發生錯誤, 請問該如何修改
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/10 下午 09:43:13
> 可否再請教 :
> 因為執行檔是 pkzip.exe , 若欲被壓縮之檔案為 test.txt , 程式如下
>
>SHELLEXECUTEINFO info;

SHELLEXECUTEINFO 有幾個必設的成員你有設嗎?

>info.lpVerb="pkzip";

有去看看 SHELLEXECUTEINFO 的說明嗎?
  info.lpVerb = "open"

info.lpFile 才是指向 "<路徑>/pkzip.exe"


>info.lpParameters="test.txt";

你若是在 command prompt 上用 pkzip 是怎麼打的?

  pkzip test.zip test.txt

lpParameters 指向 "pkzip" 後面的指令參數:

  info.lpParameters = "test.zip test.txt";


>ShellExecuteEx(&info);
>WaitForSingleObject(info.hProcess,0);
>
>發生錯誤, 請問該如何修改

下回發問時, 請具體的說明是個什麼樣的錯誤, 在那一行發生, 錯誤碼是什麼 (GetLastError()). 你不幫我們了解問題所在, 要我們如何幫助你?

作者 : mingyuan(yuan)
[ 貼文 79 | 人氣 4539 | 評價 110 | 評價/貼文 1.39 | 送出評價 10 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/11 上午 08:37:32
感謝指教 , 但我還是試不出來 , 以下為程式碼 , 錯誤代碼為 5

void CPgvDlg::bzi1(char *filename)
{
     char zip_file[60];
     char sss[50];

     strcpy(bin_file,btm_path);
     strcat(bin_file,"\\");
     strcat(bin_file,filename); // filename 無附加檔名
     strcat(bin_file,".bin"); // bin_file 為欲被壓縮之檔案 , 已包含絕對路徑

     strcpy(zip_file,tmp_path);
     strcat(zip_file,"\\");
     strcat(zip_file,filename); // zip_file 為將來壓縮後之檔名

     // _spawnl(0,"pkzip","pkzip",zip_file,bin_file,NULL); // 這是我本來的壓縮方法
     , 每壓縮一次, 螢幕會跳一次


   SHELLEXECUTEINFO info;
   info.lpVerb="open";
   info.lpFile="pkzip"; // pkzip 放在 default directory

   strcpy(sss,zip_file);
   strcat(sss," ");
   strcat(sss,bin_file);

   info.lpParameters=sss;

   ShellExecuteEx(&info);
   int err=GetLastError();
   WaitForSingleObject(info.hProcess,0);

} //程式結束

請不吝指教

作者 : sjohn0523(小約翰) VC++卓越專家貼文超過500則人氣指數超過10000點
[ 貼文 585 | 人氣 12261 | 評價 2690 | 評價/貼文 4.6 | 送出評價 42 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/11 下午 02:57:07
試了試,幾乎參數都要設定
   SHELLEXECUTEINFO info;
   memset(&info, 0, sizeof(info));
   info.lpVerb="open";
   info.lpFile="c:\\test4.exe"; // 此為我隨便用的執行檔
   info.nShow=SW_SHOW;
   info.cbSize=sizeof(info);

網路上抓的範例
http://c.developpez.com/faq/vc/?page=ProcessThread
作者 : sjohn0523(小約翰) VC++卓越專家貼文超過500則人氣指數超過10000點
[ 貼文 585 | 人氣 12261 | 評價 2690 | 評價/貼文 4.6 | 送出評價 42 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/11 下午 03:00:05
為了除錯才用SW_SHOW,隱藏式SW_HIDE @@"
作者 : mingyuan(yuan)
[ 貼文 79 | 人氣 4539 | 評價 110 | 評價/貼文 1.39 | 送出評價 10 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/11 下午 03:49:25
感謝指教 , 但我發現有一重大缺失 . 先秀出完整程式碼 :

void CPgvDlg::bzi1(char *filename)
{
     char zip_file[60];
     char sss[50];

     strcpy(bin_file,btm_path);
     strcat(bin_file,"\\");
     strcat(bin_file,filename); // filename 無附加檔名
     strcat(bin_file,".bin"); // bin_file 為欲被壓縮之檔案 , 已包含絕對路徑

     strcpy(zip_file,tmp_path);
     strcat(zip_file,"\\");
     strcat(zip_file,filename); // zip_file 為將來壓縮後之檔名

     // _spawnl(0,"pkzip","pkzip",zip_file,bin_file,NULL); // 這是我本來的壓縮方法
     , 每壓縮一次, 螢幕會跳一次


    SHELLEXECUTEINFO info;
   memset(&info, 0, sizeof(info));
   info.nShow=SW_HIDE;
   info.cbSize=sizeof(info);
   info.lpVerb="open";
   info.lpFile="pkzip"; // pkzip 放在 default directory

   strcpy(sss,zip_file);
   strcat(sss," ");
   strcat(sss,bin_file);

   info.lpParameters=sss;

   ShellExecuteEx(&info);
   int err=GetLastError();
   WaitForSingleObject(info.hProcess,0);

   Sleep(500); //delay

} //程式結束

若不加上最後一行 ( Sleep(),作用相當於 delay) , 則程式會 "不待壓縮檔產生完畢" 就接著呼叫此函式 (bzi1) 下一行的動作 ( 要用到 zip 檔) , 於是發生 file not found.
此問題已困擾多時 , 請不吝指教
作者 : sjohn0523(小約翰) VC++卓越專家貼文超過500則人氣指數超過10000點
[ 貼文 585 | 人氣 12261 | 評價 2690 | 評價/貼文 4.6 | 送出評價 42 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/11 下午 03:53:43
這是因為你的WaitForSingleObject沒用好
作者 : sjohn0523(小約翰) VC++卓越專家貼文超過500則人氣指數超過10000點
[ 貼文 585 | 人氣 12261 | 評價 2690 | 評價/貼文 4.6 | 送出評價 42 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/11 下午 04:30:29
試了一下,發現預設的參數要多一行
info.fMask= SEE_MASK_NOCLOSEPROCESS;
否則info.hProcess永遠是NULL

然後再使用下兩行~
check_done:;
if(WaitForSingleObject(info.hProcess,100)==WAIT_TIMEOUT)goto check_done;

或者用無限回圈配合break,也是可行的.
作者 : kidaahuang(kidaa)
[ 貼文 31 | 人氣 4391 | 評價 30 | 評價/貼文 0.97 | 送出評價 6 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/11 下午 07:29:16

> ShellExecuteEx(&info);
> int err=GetLastError();
> WaitForSingleObject(info.hProcess,0);
>
> Sleep(500); //delay
>
>} //程式結束
>
>若不加上最後一行 ( Sleep(),作用相當於 delay) , 則程式會 '不待壓縮檔產生完畢' 就接著呼叫此函式 (bzi1) 下一行的動作 ( 要用到 zip 檔) , 於是發生 file not found.
>此問題已困擾多時 , 請不吝指教
>
原來我上次少打了,抱歉
WaitForSingleObject(info.hProcess,INFINITE); // 使用INFINITE參數會讓此函式等待Process完成後才離開此函式
作者 : mingyuan(yuan)
[ 貼文 79 | 人氣 4539 | 評價 110 | 評價/貼文 1.39 | 送出評價 10 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/15 上午 08:11:11
主程式碼如下:

SHELLEXECUTEINFO info;
info.fMask= SEE_MASK_NOCLOSEPROCESS; //否則info.hProcess永遠是NULL
memset(&info, 0, sizeof(info));
info.nShow=SW_HIDE;
info.cbSize=sizeof(info);
info.lpVerb="open";
info.lpFile="pkzip";

strcpy(sss,zip_file); // zip_file 為壓縮後之檔名字串
strcat(sss," ");
strcat(sss,bin_file); // bin_file 為欲被壓縮之檔名字串
info.lpParameters=sss;

ShellExecuteEx(&info);
WaitForSingleObject(info.hProcess,INFINITE);


改成這樣依舊無效 ( 程式不待壓縮動作完成就要使用壓縮檔) , 且 WaitForSingleObject(info.hProcess,INFINITE) 之傳回執始終不變 (-1) , 故無法藉由其傳回值判斷 ShellEXecuteEx() 是否執行完畢
 
作者 : sjohn0523(小約翰) VC++卓越專家貼文超過500則人氣指數超過10000點
[ 貼文 585 | 人氣 12261 | 評價 2690 | 評價/貼文 4.6 | 送出評價 42 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/15 上午 09:25:55
SHELLEXECUTEINFO info;
info.fMask= SEE_MASK_NOCLOSEPROCESS;
memset(&info, 0, sizeof(info));
改成
SHELLEXECUTEINFO info;
memset(&info, 0, sizeof(info));
info.fMask= SEE_MASK_NOCLOSEPROCESS;
執行的順序有問題..
memset(&info, 0, sizeof(info));
是把info清空為0..
作者 : mingyuan(yuan)
[ 貼文 79 | 人氣 4539 | 評價 110 | 評價/貼文 1.39 | 送出評價 10 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/1/15 上午 10:20:53
You are right. 我不該將值設定之後又清掉 , 故正確程序如下:

{

SHELLEXECUTEINFO info;
memset(&info, 0, sizeof(info));
info.fMask= SEE_MASK_NOCLOSEPROCESS; //否則info.hProcess永遠是NULL

info.nShow=SW_HIDE; //隱藏 Dos 視窗
info.cbSize=sizeof(info);
info.lpVerb="open";
info.lpFile="pkzip";

strcpy(sss,zip_file);
strcat(sss," ");
strcat(sss,bin_file);
info.lpParameters=sss; // pkzip 之參數要 2個

ShellExecuteEx(&info);
WaitForSingleObject(info.hProcess,INFINITE); //傳回值為 1

}

此問題已困擾我 1年 , 至今完全解決 , 感謝大家 !

 板主 : 青衫 , Raymond
 > Visual C++ - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++
1 青衫 11070 
2 Raymond 10090 
3 Clier 7630 
4 小約翰 2500 
5 Cog 2030 
6 coco 1870 
7 aming 1410 
8 牧童哥 1400 
9 r2109 1380 
10 Akira 1350 
Visual C++
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.203125