|
|
2017/4/29(Sat) 22:05:52|NO.79371
こんばんは、お世話になります。
HSPからShellExecute関数でテキストファイルを開き、それが閉じられるまで待機させるようにしたいと思ってるんですが、どのようにしたらよいか、アドバイスを頂けないでしょうか。
最初は、ファイルハンドルが取得できるかどうかを判定して試してみたんですが、私が試した限りだとエディタはファイルをロックしないようなので、この方法は使えませんでした。
普通の実行ファイルなら、pipegetとかCreatProcessとかのやり方があるんですが、どれも使えなさそうです。
あと、できれば関連付けされたアプリで起動させたいので、エディタを固定するという案はなしの方向でお願いします。
なかなか難しいとは思いますが、アドバイスをいただければ幸いです。
それでは。
|
|
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
こんばんは、お世話になります。
あぁ、またやってしまった…。
スペースさん、ありがとうございます。そういうことです。
|
|
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
|
|
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++のランタイムエラーになってしまいました。
どのようにすればよいか、アドバイスを頂けると幸いです。
よろしくお願いします。

| |
|
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
こんにちは、お世話になります。
ほんとですね。スペースが入ってないことに先ほど気づきました。
ありがとうございました。
|
|