HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0429
開いたファイルが閉じられるまで待機する方法13解決


リンク

2017/4/29(Sat) 22:05:52|NO.79371

 こんばんは、お世話になります。

 HSPからShellExecute関数でテキストファイルを開き、それが閉じられるまで待機させるようにしたいと思ってるんですが、どのようにしたらよいか、アドバイスを頂けないでしょうか。
 最初は、ファイルハンドルが取得できるかどうかを判定して試してみたんですが、私が試した限りだとエディタはファイルをロックしないようなので、この方法は使えませんでした。
 普通の実行ファイルなら、pipegetとかCreatProcessとかのやり方があるんですが、どれも使えなさそうです。
 あと、できれば関連付けされたアプリで起動させたいので、エディタを固定するという案はなしの方向でお願いします。
 なかなか難しいとは思いますが、アドバイスをいただければ幸いです。
 それでは。



この記事に返信する


MillkeySoftw

リンク

2017/4/29(Sat) 22:50:42|NO.79373

まず、なにをしたいか具体的に書いてください。
1.指定されたテキストファイルを ShellExecute を用いて起動したい。
2.起動したアプリケーションが終了した事を検出したい。

の 2点だよね?
途中からファイルのロックだの、pipeexec だの出てきてるけど。なにをしたいの?



スペース

リンク

2017/4/29(Sat) 23:11:00|NO.79374

「ファイルを関連付けされたソフトで起動→そのソフトが終了するまで待機」
こういうことでは?



リンク

2017/4/29(Sat) 23:16:46|NO.79376

 こんばんは、お世話になります。

 混乱させてしまい、すみません。
 テキストファイルを関連付けされたエディタで開きたいんですが、エディタが終了されるまで待機させる方法がわかりません。
 関連付けをもとに開くには、ShellExecuteやexec命令のパラメータに16を付けて開く方法があることはわかっているんですが、どちらの方法もエディタが起動された瞬間に次の処理に移ってしまいます。
 何か方法があれば教えていただけると幸いです。

 こんな感じでいいでしょうか。
 よろしくお願いします。 



リンク

2017/4/29(Sat) 23:18:47|NO.79377

 こんばんは、お世話になります。

 あぁ、またやってしまった…。

 スペースさん、ありがとうございます。そういうことです。



優師¿☯(plugin)

リンク

2017/4/29(Sat) 23:31:30|NO.79378


#module #uselib "kernel32.dll" #func CloseHandle "CloseHandle" int #func CreateProcess "CreateProcessA" int,str,int,int,int,int,int,int,int,int #func WaitForSingleObject "WaitForSingleObject" int,int #deffunc SubprogramInit dim stinfo, 17 stinfo.0 = 68 dim prinfo, 4 return 0 #deffunc StartSubprogram str prm1 CreateProcess 0,prm1,0,0,0,0,0,0,varptr(stinfo),varptr(prinfo) return 0 #deffunc GetEndSubprogram str prm1 hProcess = prinfo.0 hThread = prinfo.1 CloseHandle hThread hThread = 0 WaitForSingleObject hProcess, 0xFFFFFFFF CloseHandle hProcess hProcess = 0 return 0 #global SubprogramInit StartSubprogram "notepad.exe" GetEndSubprogram "notepad.exe" if stat = 0 { dialog "notepad.exeを閉じました。",0,"メッセージ" } else { dialog "エラーが発生しました。",1,"メッセージ" } end

参考にどうぞ〜(^^



スペース

リンク

2017/4/29(Sat) 23:44:27|NO.79379

以下のスレのNO.64687のソースコードで出来ましたよ。
http://hsp.tv/play/pforum.php?mode=pastwch&num=64638



リンク

2017/4/30(Sun) 07:08:14|NO.79382

 こんにちは、お世話になります。

 とりあえず、スペースさんに紹介していただいたアドレス内の下記ソースをコピーして実行してみたんですが、プログラムの終了まで待機されないようです。

----------


#uselib "kernel32.dll" #cfunc OpenProcess "OpenProcess" sptr,sptr,sptr #func GetExitCodeProcess "GetExitCodeProcess" sptr,sptr #func CloseHandle "CloseHandle" sptr #cfunc GetProcessId "GetProcessId" sptr #uselib "shell32.dll" #cfunc ShellExecuteEx "ShellExecuteExA" sptr #define SW_SHOW$00000005 #define SEE_MASK_NOCLOSEPROCESS$00000040 #define PROCESS_QUERY_INFORMATION$00000400 #define STILL_ACTIVE$00000103 #define hInstApp8 #define hProcess14 title "テストプログラム" // メモ帳を起動 dim sei, 15;SHELLEXECUTEINFO 構造体 Verb = "open" File = "notepad" sei = 60, SEE_MASK_NOCLOSEPROCESS, hwnd, varptr(Verb), varptr(File), 0, 0, SW_SHOW if ShellExecuteEx(varptr(sei)) = 0:dialog "ファイルのオープンに失敗しました。", 1, "エラー" process_handle = sei.hProcess #if 0 ; GetExitCodeProcess へ渡すハンドルは PROCESS_QUERY_INFORMATION アクセス権が ; 割り当ててないといけないらしいけど、ShellExecuteEx で取得したプロセスハンドルでも ; 問題なく動くからこの部分は要らないかも? process_id = GetProcessId(process_handle) if process_id = 0:dialog "ファイルのオープンに失敗しました。", 1, "エラー" CloseHandle process_handle process_handle = OpenProcess(PROCESS_QUERY_INFORMATION, 1, process_id) if process_handle = 0:dialog "ファイルのオープンに失敗しました。", 1, "エラー" #endif // 終了を監視 repeat GetExitCodeProcess process_handle, varptr(exitcode) if exitcode ! STILL_ACTIVE { CloseHandle process_handle break } wait 50 loop dialog "終了を検知しました。"

----------

 また、上記アドレス内のCOMを使った方法も試してみましたが、実行ファイルのときは正常に待機されていましたが、テキストファイルを指定すると、ビジュアルC++のランタイムエラーになってしまいました。
 どのようにすればよいか、アドバイスを頂けると幸いです。

 よろしくお願いします。



MillkeySoftw

リンク

2017/4/30(Sun) 10:32:12|NO.79384

モジュール化してみたよ。

#module _Riku_RunBlock_ #uselib "Shell32.dll" #cfunc ShellExecuteEx "ShellExecuteExA" var #uselib "kernel32.dll" #func CloseHandle "CloseHandle" int #uselib "user32.dll" #cfunc MsgWaitForMultipleObjects "MsgWaitForMultipleObjects" int,var,int,int,int #define SEE_NOCLOSEPROCESS 0x02000040 #define SW_SHOW 0x0005 #define INFINITE 0xFFFFFFFF #define QS_ALLINPUT 0x00001CFF #deffunc ShellExecuteHSP str FileName,str Verb,str Parameters,str CurDir,int ExitFlag if ExitFlag : fMask = SEE_NOCLOSEPROCESS : else : fMask = 0 sdim StrData,260,4 StrData(0) = FileName,Verb,Parameters,CurDir dim SECInfo,15 SECInfo(0) = 60,fMask,0,varptr(StrData(1)),varptr(StrData(0)),varptr(StrData(2)),varptr(StrData(3)),5 LRESULT = ShellExecuteEx(SECInfo) if ExitFlag == 0 : return LRESULT FreeHandle = SECInfo.14 dim ObjectHandle,64 ObjectHandle(0) = SECInfo.14 repeat DWORD = MsgWaitForMultipleObjects(1,ObjectHandle,0,INFINITE,QS_ALLINPUT) if DWORD != 1 : break await 0 loop CloseHandle SECInfo.14 return #deffunc ExitFree onexit if FreeHandle != 0 : CloseHandle FreeHandle return #global //使い方 // ShellExecuteHSP ファイル名 ,コンテキスト操作名 ,コマンドラインパラメーター ,カレントディレクトリ, 待機するかどうか // 待機するかどうかは、1 で待機状態で 0 で即時復帰です。 mes "ファイルを関連付けされたプロセスで開き、プロセス終了まで待機します。" ShellExecuteHSP "Text.txt","edit","","",1 mes "プロセスの終了を検出しました。"



リンク

2017/4/30(Sun) 11:50:31|NO.79386

 こんにちは、お世話になります。

 MillkeySoftwさん、わざわざモジュールを作っていただき、ありがとうございました。
 これで、やりたいことが無事できました。
 ありがとうございました。



スペース

リンク

2017/4/30(Sun) 12:54:09|NO.79391

あれ?こちらの環境ではこれでちゃんと動くのですが・・・

#uselib "kernel32.dll" #cfunc OpenProcess "OpenProcess" sptr,sptr,sptr #func GetExitCodeProcess "GetExitCodeProcess" sptr,sptr #func CloseHandle "CloseHandle" sptr #cfunc GetProcessId "GetProcessId" sptr #uselib "shell32.dll" #cfunc ShellExecuteEx "ShellExecuteExA" sptr #define SW_SHOW $00000005 #define SEE_MASK_NOCLOSEPROCESS $00000040 #define PROCESS_QUERY_INFORMATION $00000400 #define STILL_ACTIVE $00000103 #define hInstApp 8 #define hProcess 14 // メモ帳を起動 dim sei, 15 ;SHELLEXECUTEINFO 構造体 Verb = "open" Dialog "txt",16 File = refstr sei = 60, SEE_MASK_NOCLOSEPROCESS, hwnd, varptr(Verb), varptr(File), 0, 0, SW_SHOW if ShellExecuteEx(varptr(sei)) = 0 :mes "失敗" process_handle = sei.hProcess #if 0 ; GetExitCodeProcess へ渡すハンドルは PROCESS_QUERY_INFORMATION アクセス権が ; 割り当ててないといけないらしいけど、ShellExecuteEx で取得したプロセスハンドルでも ; 問題なく動くからこの部分は要らないかも? process_id = GetProcessId(process_handle) if process_id = 0 :mes "失敗" CloseHandle process_handle process_handle = OpenProcess(PROCESS_QUERY_INFORMATION, 1, process_id) if process_handle = 0 :mes "失敗" #endif // 終了を監視 repeat GetExitCodeProcess process_handle, varptr(exitcode) if exitcode ! STILL_ACTIVE { CloseHandle process_handle break } wait 50 loop mes "終了"



スペース

リンク

2017/4/30(Sun) 12:58:44|NO.79392

陸さんが貼ったソースコードですが、#defineのスペースが削除され正常に動いていないのでは?

#define SW_SHOW$00000005 #define SEE_MASK_NOCLOSEPROCESS$00000040 #define PROCESS_QUERY_INFORMATION$00000400 #define STILL_ACTIVE$00000103 #define hInstApp8 #define hProcess14



~☯¿(優師)¿☯~

リンク

2017/4/30(Sun) 14:35:43|NO.79393

以下を見てください。

■良い例

#define AAA (空白) 0x0001 #define BBB (空白) 0x0002 #define CCC (空白) 0x0003

■悪い例

#define AAA0x0001 #define BBB0x0002 #define CCC0x0003

上の例に例えると

#define に空白を入れると...
HSP「AAAというマクロに0x0001を代入して登録だ!!」

#define に空白を入れないと...
HSP「AAA0x0001というマクロを登録だ!!」

という感じです^^;;



リンク

2017/4/30(Sun) 15:13:48|NO.79395

 こんにちは、お世話になります。

 ほんとですね。スペースが入ってないことに先ほど気づきました。
 ありがとうございました。



ONION software Copyright 1997-2021(c) All rights reserved.