線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2989
推到 Plurk!
推到 Facebook!

如何讓自己寫的程式可以另外開啟"小算盤"?

尚未結案
Titan_Lin
一般會員


發表:10
回覆:6
積分:3
註冊:2004-08-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-29 14:28:27 IP:210.202.xxx.xxx 未訂閱
我現在知道有兩個function可以用: ShellExecute(MainForm->Handle,"open","C:\\WINDOWS\\system32\\calc.exe",NULL,NULL,SW_SHOWNORMAL); 或 WinExec("C:\\WINDOWS\\system32\\calc.exe",SW_NORMAL); 兩個都可以開啟 但是請問用哪個會比較好? 還有 如果該台電腦沒有"calc.exe" 或者不在那個目錄 我如何去寫exceptoin呢? 對了 還有個問題 如果我要將我的程式關掉 會連由程式開啟的clac一併關掉 我要怎麼寫才好? 謝謝各位!
nlj859
資深會員


發表:139
回覆:375
積分:322
註冊:2004-03-20

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-08-29 15:31:35 IP:219.80.xxx.xxx 未訂閱
引言: 我現在知道有兩個function可以用: ShellExecute(MainForm->Handle,"open","C:\\WINDOWS\\system32\\calc.exe",NULL,NULL,SW_SHOWNORMAL); 或 WinExec("C:\\WINDOWS\\system32\\calc.exe",SW_NORMAL); 兩個都可以開啟 但是請問用哪個會比較好? 還有 如果該台電腦沒有"calc.exe" 或者不在那個目錄 我如何去寫exceptoin呢? 對了 還有個問題 如果我要將我的程式關掉 會連由程式開啟的clac一併關掉 我要怎麼寫才好? 謝謝各位!
Hello Titan_Lin, 判斷某個程式是否存在,存在即開啟.關閉程式則另外關閉小算盤
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 if (FileExists("C:\\WINNT\\system32\\calc.exe"))
     ShellExecute(NULL,NULL,"C:\\WINNT\\system32\\calc.exe",NULL,NULL,SW_SHOW);
}    void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
HWND HWndCalculator;
//find calculator
HWndCalculator=FindWindow(NULL,"小算盤");
//close Calculator
if (HWndCalculator!=0)
  SendMessage(HWndCalculator, WM_CLOSE, 0, 0);
}
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-08-30 00:17:04 IP:61.221.xxx.xxx 未訂閱
引言: 我現在知道有兩個function可以用: ShellExecute(MainForm->Handle,"open","C:\\WINDOWS\\system32\\calc.exe",NULL,NULL,SW_SHOWNORMAL); 或 WinExec("C:\\WINDOWS\\system32\\calc.exe",SW_NORMAL); 兩個都可以開啟 但是請問用哪個會比較好? 還有 如果該台電腦沒有"calc.exe" 或者不在那個目錄 我如何去寫exceptoin呢? 對了 還有個問題 如果我要將我的程式關掉 會連由程式開啟的clac一併關掉 我要怎麼寫才好? 謝謝各位!
Titan_Lin 你好:
(1)以 calc.exe 來說,應該是不需要指定路徑的,因為 calc.exe 在 Windows
   98/ME/NT/2000/XP/2003 裡面,不是放在 Windows 的目錄裡面,就是放在
   System 的目錄底下,而這些路徑在一開機的時候,就已經記錄在作業系統的
   全域變數「Path」裡面 (你可以自己開一個 DOS BOX,然後鍵入「path」,
   就可以看到這個變數裡面記錄的內容)
(2)也就是說,如果你想要呼叫 calc.exe 的話,就不需要再另外指定路徑,只
   要這樣子寫,應該就可以了
   ShellExecute(NULL, NULL, "calc.exe", NULL, NULL, SW_SHOWNORMAL);
(3)但是你希望 calc.exe 被打開之後,能夠隨著自己的程式被關閉,而一起自
   動關閉,那麼建議你利用 Win32 API CreateProcess 和 TerminateProcess
   來達到目的
(4)以下的範例程式碼是在 Form 被建立的時候,就開啟 calc.exe (如果找不到
   calc.exe,則會有錯誤訊息);在 Form 被關閉的時候,自動關閉 calc.exe
   ,因此要分別把控制的程式碼寫在 Form 的 constructor 以及 destructor
   裡面,例如:
// Unit1.h
class TForm1 : public TForm
{
__published:        // IDE-managed Components
   //...略...
private:        // User declarations
   //...略...
public:                // User declarations
   __fastcall TForm1(TComponent* Owner);
   __fastcall ~TForm1();
};
// Unit1.cpp 
STARTUPINFO gsi;
PROCESS_INFORMATION gpi;    __fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
   if(!gpi.hProcess)
   {
      ZeroMemory(&gsi, sizeof(STARTUPINFO));
      gsi.cb=sizeof(STARTUPINFO);
      ZeroMemory(&gpi, sizeof(PROCESS_INFORMATION));
      if(!CreateProcess(NULL, "calc.exe", NULL, NULL, false,
         CREATE_NEW_PROCESS_GROUP+NORMAL_PRIORITY_CLASS, NULL, NULL, &gsi, &gpi))
      {
         ShowMessage("Can't not find calc.exe");
      }
   }
}
__fastcall TForm1::~TForm1()
{
   if(gpi.hProcess)
   {
      TerminateProcess(gpi.hProcess, 0);
   }
}
(5)你可以再依照自己的需求,調整程式碼的位置,例如: 假設你要利用一個按
   鈕來呼叫 calc.exe 的話,那就把上面 constructor 中的程式碼,移到
   ButtonClick 裡面,應該就可以了
(6)MSDN 原始說明文件
   http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createprocess.asp
   http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/terminateprocess.asp
-- Enjoy Researching & Developing --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
系統時間:2024-04-29 6:21:15
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!