[掲示板に戻る] 全部 1- 最新50 |
1 | prolog_e 漢字 ctrl+c |
sasagawa 2011-6-10 3:56
[返信] [編集] prolog_eのChezEditでの動作検証です。 漢字はシフトJIS、UTF8ともに正常に表示されました。 ご指摘のCTRL+Cによるインタラプトの件ですが、なぜインタラプトがかからないのか調査中です。APIの引数に問題があるかもしれません。 PChar(CmdLine), nil, nil, true, CREATE_NEW_PROCESS_GROUP, nil, nil, StartInfoCh, ProcInfo); while true do case WaitForMultipleObjects(3,@h,false,INFINITE) of WAIT_OBJECT_0 + 0: begin GenerateConsoleCtrlEvent(CTRL_C_EVENT,ProcInfo.dwProcessid); このGenerateConsoleCtrlEventの2番目の引数です。同一プロセスグループにシグナルを送っているのですが、ここを0にして全部のプロセスにシグナルを送る必要があるかもしれません。時間がかかりそうです。少し時間をいただきます。調べてみます。 |
|
2 | Re: prolog_e 漢字 ctrl+c |
sasagawa 2011-6-10 7:46
[返信] [編集] ChezEditが子プロセスを呼び出しているコードを全部掲載します。 1番目がCtrl+Cシグナル、3番目がCTRL+Dシグナルを送っている部分です。 Petite Chez Scheme はこのCTRL+Cでインタラプトがかかっています。 SML/NJはこのCTRL+Dでインタラプトがかかっています。 Gauche/Win、Mosh/WinではうまくCTRL+Cがかかっていません。 prolog_eにおいても同様です。 以下Delphiコードです。 program ChezSpawn; {$APPTYPE CONSOLE} uses SysUtils, Windows, Messages; var CmdLine,Startup: string; h: array[0..3] of THandle; ClassName: array[1..20] of Char; hwndCloseWindow: HWND; StartInfoCh: STARTUPINFO; ProcInfo: PROCESS_INFORMATION; Window: string; I: integer; label CloseExit; begin { TODO -oUser -cConsole Main : ここにプログラムコードを書いてください } CmdLine := ParamStr(4); Startup := ParamStr(5); CmdLine := CmdLine + ' ' + Startup; h[0] := StrToInt(ParamStr(1)); //interrupt h[1] := StrToInt(ParamStr(2)); //CtrlBreak h[2] := StrToInt(ParamStr(3)); //CtrlD GetStartupInfo(StartInfoCh); with StartInfoCh do begin wShowWindow := SW_HIDE; dwFlags := STARTF_USESHOWWINDOW; end; CreateProcess(nil, PChar(CmdLine), nil, nil, true, CREATE_NEW_PROCESS_GROUP, nil, nil, StartInfoCh, ProcInfo); while true do case WaitForMultipleObjects(3,@h,false,INFINITE) of WAIT_OBJECT_0 + 0: begin GenerateConsoleCtrlEvent(CTRL_C_EVENT,ProcInfo.dwProcessid); end; WAIT_OBJECT_0 + 1: begin GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,ProcInfo.dwProcessid); GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,ProcInfo.dwProcessid); GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,ProcInfo.dwProcessid); GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,ProcInfo.dwProcessid); GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,ProcInfo.dwProcessid); GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,ProcInfo.dwProcessid); GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,ProcInfo.dwProcessid); GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,ProcInfo.dwProcessid); Window := 'ConsoleWindowClass'; strcopy(@ClassName,PChar(Window)); hwndCloseWindow := FindWindow(@ClassName,nil); PostMessage(hwndCloseWindow,WM_CLOSE,0,0); goto CloseExit; end; WAIT_OBJECT_0 + 2: begin GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,ProcInfo.dwProcessid); end; end; CloseExit: for I:= 0 to 2 do CloseHandle(h[i]); end. |
[掲示板に戻る] 全部 次100 最新50 |