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

send control-c to console mode application

尚未結案
a174709
一般會員


發表:5
回覆:3
積分:1
註冊:2005-08-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-26 16:48:46 IP:210.243.xxx.xxx 訂閱
各位大大, 

[code cpp]
STARTUPINFO si;
PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );

// Start the child process.
if(!CreateProcess(NULL,
"ping -t 127.0.0.1",
NULL,
NULL,
TRUE,
CREATE_NEW_PROCESS_GROUP /*0*/,
NULL,
NULL,
&si,
&pi)
)
{
return true;
}

if (SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleHandler, TRUE) != 0) {
if (GenerateConsoleCtrlEvent(CTRL_C_EVENT, pi.dwProcessId) == 0)
ShowMessage("GenerateConsoleCtrlEvent fail.");
} else
ShowMessage("SetConsoleCtrlHandler fail.");

[/code]

callback function
[code cpp]
bool __fastcall ConsoleHandler(DWORD CEvent)
{
switch(CEvent) {
case CTRL_C_EVENT:
ShowMessage(NULL, "CTRL C received!");
break;

case CTRL_BREAK_EVENT:
ShowMessage("CTRL BREAK received!");
break;

case CTRL_CLOSE_EVENT:
ShowMessage("Program being closed!");
break;

case CTRL_LOGOFF_EVENT:
ShowMessage("User is logging off!");
break;

case CTRL_SHUTDOWN_EVENT:
ShowMessage("User is logging off!");
break;
}
return TRUE;
}

[/code]


我想要使用 Control C 讓這個 console mode 裡的 ping 程式停止執行的話該如何做呢?
我不使用 TerminateProcess 結束掉, 我參考了一下其它的資料,有提到可以用
SetConsoleCtrlHandler 來先設定中斷要執行的 method ,再使用 GenerateConsoleCtrlEvent
產生 Control-C 的中斷,但是 SetConsoleCtrlHandler 在 BCB5裡我不知道該怎麼做(一直 complier error)
我參考 MSDN, SetConsoleCtrlHandler 第一個參數是 PHANDLER_ROUTINE Type 要傳一個 function address
在 VC 裡是把這個函式宣告成 WINAPI 也就是 __stdcall , 但是在 BCB 裡是用 __fastcall , 所以一直不知道該怎麼先
完成 SetConsoleCtrlHandler function 的部份, 其次是該如何實作Control-C的部份
不知道各位大大有什麼想法嗎?還是有其它可參考的地方呢?
謝謝....

compiler error message:(錯在 SetConsoleCtrlHandler 的地方)
[C Error] Unit1.cpp(84): E2235 Member function must be called or its address taken
編輯記錄
a174709 重新編輯於 2008-03-26 16:53:07, 註解 無‧
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-27 17:23:54 IP:140.116.xxx.xxx 訂閱

需要傳入位址 ??

[code cpp] if(SetConsoleCtrlHandler((PHANDLER_ROUTINE) &ConsoleHandler, TRUE) != 0) [/code]
------
FPGA驗證, FPGA開發平台, http://smims.com
編輯記錄
ikk 重新編輯於 2008-03-27 17:25:12, 註解 無‧
a174709
一般會員


發表:5
回覆:3
積分:1
註冊:2005-08-07

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-03-27 22:43:21 IP:118.160.xxx.xxx 訂閱
[C++ Error] Unit1.cpp(43): E2031 Cannot cast from 'bool (_fastcall * (_closure )(unsigned long))(unsigned long)' to 'int (__stdcall *)(unsigned long)'
試過了, compiler 還是有問題, 這次是出現上面的訊息
系統時間:2024-04-25 9:34:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!