「コマンドプロンプト」は非表示にできない?
「コマンドプロンプト」は非表示にできない?
ABのGUIが好きで何とか自分の仕事に使おうと考えていますが、「Exec」関数を使ったくらいではうまく行かないことがわかりました。
過去ログで昔懐かしいバッチファイルにjperlを仕込んでGUI部分をABで作れば何とか「使える」ことを知りました。
ただ、この方法では思いっきり「コマンドプロンプト」が表示されてしまいます。実害は無いのでどうでもいいと言えばどうでもいいのですが、消す方法があればどなたか教えてもらえませんか?
ABのGUIでjperlを使うという方針には変わりはありません。perlに代わる「パターンマッチ」を持つ言語でも登場すれば鞍替えしたいところですが、今のところそれは無いようなのでjperlを使っています。必要に応じてCygwinのPerl5.8も利用しています。
過去ログで昔懐かしいバッチファイルにjperlを仕込んでGUI部分をABで作れば何とか「使える」ことを知りました。
ただ、この方法では思いっきり「コマンドプロンプト」が表示されてしまいます。実害は無いのでどうでもいいと言えばどうでもいいのですが、消す方法があればどなたか教えてもらえませんか?
ABのGUIでjperlを使うという方針には変わりはありません。perlに代わる「パターンマッチ」を持つ言語でも登場すれば鞍替えしたいところですが、今のところそれは無いようなのでjperlを使っています。必要に応じてCygwinのPerl5.8も利用しています。
Re: 「コマンドプロンプト」は非表示にできない?
> 過去ログで昔懐かしいバッチファイルにjperlを仕込んでGUI部分をABで作れば何とか「使える」ことを知りました。
どのように実行しているのでしょう?
DOS窓のEXEであれば「SW_HIDE」を使用すればウインドウは表示されません。
ShellExecute(hMainWnd,NULL,"C:\XXX.exe","",NULL,SW_HIDE) As Long
どのように実行しているのでしょう?
DOS窓のEXEであれば「SW_HIDE」を使用すればウインドウは表示されません。
ShellExecute(hMainWnd,NULL,"C:\XXX.exe","",NULL,SW_HIDE) As Long
Re: 「コマンドプロンプト」は非表示にできない?
> > 過去ログで昔懐かしいバッチファイルにjperlを仕込んでGUI部分をABで作れば何とか「使える」ことを知りました。
>
> どのように実行しているのでしょう?
> DOS窓のEXEであれば「SW_HIDE」を使用すればウインドウは表示されません。
>
> ShellExecute(hMainWnd,NULL,"C:\XXX.exe","",NULL,SW_HIDE) As Long
perlの場合、
jperl c:\prog\hello_world.pl hoge.txt >goho.txt
というふうに、
(1)jperlというアプリケーション、
(2)hello_world.plというjperlに渡すスクリプト、
(3)処理対象ファイル、
(4)リダイレクト先
を指定してやらなければならず、それをABではどう表現していいか
わからず、結局
Exec "C:\hoge.bat"
と、上記の内容をそのままバッチファイルの中に仕込んだわけです。
>
> どのように実行しているのでしょう?
> DOS窓のEXEであれば「SW_HIDE」を使用すればウインドウは表示されません。
>
> ShellExecute(hMainWnd,NULL,"C:\XXX.exe","",NULL,SW_HIDE) As Long
perlの場合、
jperl c:\prog\hello_world.pl hoge.txt >goho.txt
というふうに、
(1)jperlというアプリケーション、
(2)hello_world.plというjperlに渡すスクリプト、
(3)処理対象ファイル、
(4)リダイレクト先
を指定してやらなければならず、それをABではどう表現していいか
わからず、結局
Exec "C:\hoge.bat"
と、上記の内容をそのままバッチファイルの中に仕込んだわけです。
Re: 「コマンドプロンプト」は非表示にできない?
> perlの場合、
>
> jperl c:\prog\hello_world.pl hoge.txt >goho.txt
>
> というふうに、
こんな感じで行くと思います。
ShellExecute(hMainWnd,NULL,"C:\hoge.bat","",NULL,SW_HIDE)
>
> jperl c:\prog\hello_world.pl hoge.txt >goho.txt
>
> というふうに、
こんな感じで行くと思います。
ShellExecute(hMainWnd,NULL,"C:\hoge.bat","",NULL,SW_HIDE)
Re: 「コマンドプロンプト」は非表示にできない?
> > perlの場合、
> >
> > jperl c:\prog\hello_world.pl hoge.txt >goho.txt
> >
> > というふうに、
>
> こんな感じで行くと思います。
> ShellExecute(hMainWnd,NULL,"C:\hoge.bat","",NULL,SW_HIDE)
↑
これで「コマンドプロンプト」は開かずに済むことを確認しました。
ありがとうございます。
ただ、今度は「いつ終わったのか」を判断してウインドウを表示
する必要が出てきました。f^^;
> >
> > jperl c:\prog\hello_world.pl hoge.txt >goho.txt
> >
> > というふうに、
>
> こんな感じで行くと思います。
> ShellExecute(hMainWnd,NULL,"C:\hoge.bat","",NULL,SW_HIDE)
↑
これで「コマンドプロンプト」は開かずに済むことを確認しました。
ありがとうございます。
ただ、今度は「いつ終わったのか」を判断してウインドウを表示
する必要が出てきました。f^^;
ShellExecuteEx関数+GetExitCodeProcess関数の組み合わせでできるようです(手持ちのVB6APIの本より)。ただ、今度は「いつ終わったのか」を判断してウインドウを表示
する必要が出てきました。f^^;
SHELLEXECUTEINFO構造体にファイル名やパラメータ・動作名("open")を設定し、fMaskメンバにSEE_MASK_NOCLOSEPROCESSを指定してShellExecute関数を呼び出します。
そうすると構造体のhProcessメンバにプロセスハンドルが返されるので、これをGetExitCodeProcess関数(場合によって他の関数でもOK)の引数に指定して待機します。
詳しいコードは省略しますので調べてみてください。
[hira]
http://hira.hopto.org/
http://hira.hopto.org/
ちなみにリダイレクトの必要さえなければExec "jperl", "c:\prog\hello_world.pl hoge.txt"のようにすればできます。
さて、起動したプログラムが終了したかどうか検出をしたいときには
ShellExecuteやExecは残念ながら使えません。
CreateProcessやShellExecuteExでできるのですが、
後者はたしかABのインクルードファイル内に宣言がないので前者を使ってみます。
しかもCreateProcessにはリダイレクトの機能があります。これを使わないわけにはいきません。
リダイレクトには「パイプ」を使ってファイルを通さずに直接読み取るようになっています。
たとえばこう使います。(私はPerlはやらないのでjperlの代わりに別のプログラムでテストしましたが)
これは出力された内容の最初の256文字を読み出すように作ってあります。
と、ここまで書いたところで読み返してみて思ったのですが、
パピヨンさんは正規表現を使いたいがためにPerlを使っているのですよね。
正規表現だけならBREGEXP.DLLを使えばABからでもなんでも使えますよ。
これを考えてみるのもどうでしょうか。
さて、起動したプログラムが終了したかどうか検出をしたいときには
ShellExecuteやExecは残念ながら使えません。
CreateProcessやShellExecuteExでできるのですが、
後者はたしかABのインクルードファイル内に宣言がないので前者を使ってみます。
しかもCreateProcessにはリダイレクトの機能があります。これを使わないわけにはいきません。
[ここをクリックすると内容が表示されます]
肝はCreateProcessであり、WaitForSingleObjectが終了まで待つという動作を行います。コード: 全て選択
#strict
Declare Function CreatePipe Lib "Kernel32" (
ByRef hReadPipe As HANDLE,
ByRef hWritePipe As HANDLE,
ByVal pPipeAttributes As *SECURITY_ATTRIBUTES,
ByVal nSize As DWORD) As Long
Function ExecWithRedirectOutputAndWait(pszCmdLine As BytePtr) As HANDLE
Dim sa As SECURITY_ATTRIBUTES
With sa
.nLength = Len(sa)
.lpSecurityDescriptor = 0
.bInheritHandle = TRUE
End With
Dim hRead As HANDLE, hWrite As HANDLE
If CreatePipe(hRead, hWrite, VarPtr(sa), 0) <> FALSE Then
Dim si As STARTUPINFO, pi As PROCESS_INFORMATION
ZeroMemory(VarPtr(si), Len(si))
With si
.cb = Len(si)
.dwFlags = STARTF_USESTDHANDLES
.hStdInput = 0
.hStdOutput = hWrite
.hStdError = 0 'hWrite
End With
If CreateProcess(0, CMD, ByVal 0, ByVal 0, TRUE, DETACHED_PROCESS, 0, 0, si, pi) Then
CloseHandle(pi.hThread)
WaitForSingleObject(pi.hProcess, INFINITE)
ExecWithRedirectOutputAndWait = hRead
CloseHandle(pi.hProcess)
End If
CloseHandle(hWrite)
If ExecWithRedirectOutputAndWait = 0 Then
CloseHandle(hRead)
End If
End If
End Function
リダイレクトには「パイプ」を使ってファイルを通さずに直接読み取るようになっています。
たとえばこう使います。(私はPerlはやらないのでjperlの代わりに別のプログラムでテストしましたが)
コード: 全て選択
Dim hHandle As HANDLE
hHandle = ExecWithRedirectOutputAndWait("jperl c:\prog\hello_world.pl hoge.txt")
Dim Buf[256] As Byte, ReadBytes As DWord
ReadFile(hHandle, Buf, Len(Buf), VarPtr(ReadBytes), ByVal 0)
CloseHandle(hHandle)
MessageBox(0, Buf, 0, 0)
と、ここまで書いたところで読み返してみて思ったのですが、
パピヨンさんは正規表現を使いたいがためにPerlを使っているのですよね。
正規表現だけならBREGEXP.DLLを使えばABからでもなんでも使えますよ。
これを考えてみるのもどうでしょうか。
>
> SHELLEXECUTEINFO構造体にファイル名やパラメータ・動作名("open")を設定し、fMaskメンバにSEE_MASK_NOCLOSEPROCESSを指定してShellExecute関数を呼び出します。
> そうすると構造体のhProcessメンバにプロセスハンドルが返されるので、これをGetExitCodeProcess関数(場合によって他の関数でもOK)の引数に指定して待機します。
> 詳しいコードは省略しますので調べてみてください。
さっそく昨日ShellExecuteの終了をどこかでつかまえられないかといろいろ
やってみましたができなかったんですね。(T_T)
今後、いろいろとやってみますがちょっと難しい話しになってきたという感
じです。詳しいやり方を教えていただいたのですが今のところ理解できてい
ません。申し訳ないです。
> ShellExecuteEx関数+GetExitCodeProcess関数の組み合わせでできるようです(手持ちのVB6APIの本より)。ただ、今度は「いつ終わったのか」を判断してウインドウを表示
> する必要が出てきました。f^^;
> SHELLEXECUTEINFO構造体にファイル名やパラメータ・動作名("open")を設定し、fMaskメンバにSEE_MASK_NOCLOSEPROCESSを指定してShellExecute関数を呼び出します。
> そうすると構造体のhProcessメンバにプロセスハンドルが返されるので、これをGetExitCodeProcess関数(場合によって他の関数でもOK)の引数に指定して待機します。
> 詳しいコードは省略しますので調べてみてください。
さっそく昨日ShellExecuteの終了をどこかでつかまえられないかといろいろ
やってみましたができなかったんですね。(T_T)
今後、いろいろとやってみますがちょっと難しい話しになってきたという感
じです。詳しいやり方を教えていただいたのですが今のところ理解できてい
ません。申し訳ないです。
> たとえばこう使います。(私はPerlはやらないのでjperlの代わりに別のプログラムでテストしましたが)
>
> これは出力された内容の最初の256文字を読み出すように作ってあります。
具体的な記述をありがとうございます。
ただ、私の場合ABでファイルをread、writeする方法も理解していない
状態なのでちょっと時間がかかりそうです。
> と、ここまで書いたところで読み返してみて思ったのですが、
> パピヨンさんは正規表現を使いたいがためにPerlを使っているのですよね。
> 正規表現だけならBREGEXP.DLLを使えばABからでもなんでも使えますよ。
> これを考えてみるのもどうでしょうか。
すべてABでとも思いましたが、COBOL→AWK→Perlという経歴をたどって
きたものですからなかなか難しいのです。
データ「型」とかファイル読み込みのためのバッファを用意するという考え
がなかなかうまく利用できない点です。
「文字」を相手にする仕事(出版関係)なので今のところPerlがベストな
選択だと考えています。なぜ、ABなのかというと「コマンドプロンプト」
からスクリプトを実行する「やり方」にどうしてもアレルギーがある人も
多いので何とかできないものかと思っていたところ昨年ABの本に出会い
ました。このRADツールは「使える」と思っていたので思い切ってここで
質問してみたという次第です。
「HSP」とか「なでしこ」とか「WideStudio」もやろうとしてみましたが、
何とか形になったのはABのみでした。f^^;
>
コード: 全て選択
Dim hHandle As HANDLE
> hHandle = ExecWithRedirectOutputAndWait("jperl c:\prog\hello_world.pl hoge.txt")
> Dim Buf[256] As Byte, ReadBytes As DWord
> ReadFile(hHandle, Buf, Len(Buf), VarPtr(ReadBytes), ByVal 0)
> CloseHandle(hHandle)
> MessageBox(0, Buf, 0, 0)
具体的な記述をありがとうございます。
ただ、私の場合ABでファイルをread、writeする方法も理解していない
状態なのでちょっと時間がかかりそうです。
> と、ここまで書いたところで読み返してみて思ったのですが、
> パピヨンさんは正規表現を使いたいがためにPerlを使っているのですよね。
> 正規表現だけならBREGEXP.DLLを使えばABからでもなんでも使えますよ。
> これを考えてみるのもどうでしょうか。
すべてABでとも思いましたが、COBOL→AWK→Perlという経歴をたどって
きたものですからなかなか難しいのです。
データ「型」とかファイル読み込みのためのバッファを用意するという考え
がなかなかうまく利用できない点です。
「文字」を相手にする仕事(出版関係)なので今のところPerlがベストな
選択だと考えています。なぜ、ABなのかというと「コマンドプロンプト」
からスクリプトを実行する「やり方」にどうしてもアレルギーがある人も
多いので何とかできないものかと思っていたところ昨年ABの本に出会い
ました。このRADツールは「使える」と思っていたので思い切ってここで
質問してみたという次第です。
「HSP」とか「なでしこ」とか「WideStudio」もやろうとしてみましたが、
何とか形になったのはABのみでした。f^^;
Re: 「コマンドプロンプト」は非表示にできない?
参考になれば…
・CUIが苦手な方のためにGUIで使わせてあげたい。
・jperlを用いてテキストに対して、正規表現マッチを行いたい。
ということはわかりました。私も印刷関係の仕事をしています。
これならABでなくても、やり方次第でVBSでも出来るのでは?
>ただ、今度は「いつ終わったのか」を判断してウインドウを表示
>する必要が出てきました。f^^;
ユーザーに通知するだけなら、MSGBOXで通知してあげてください。
>ABのGUIでjperlを使うという方針には変わりはありません。perlに代わる
>「パターンマッチ」を持つ言語でも登場すれば鞍替えしたいところですが、
>今のところそれは無いようなのでjperlを使っています。必要に応じて
>CygwinのPerl5.8も利用しています。
>パピヨンさんは正規表現を使いたいがためにPerlを使っているのですよね。
>正規表現だけならBREGEXP.DLLを使えばABからでもなんでも使えますよ。
>これを考えてみるのもどうでしょうか。
やはりVBSでやっちゃってください。VBSなら正規表現が一応できます。
VBSはW2K以上ならインストール不要でしたよね>関係各位
# 私もABでこのような処理を行いたいのですが、
VBのように ActiveX・COM などの機能を楽に扱えないため、
未だにVB6で仕事用のユーティリティを作ってます。
・CUIが苦手な方のためにGUIで使わせてあげたい。
・jperlを用いてテキストに対して、正規表現マッチを行いたい。
ということはわかりました。私も印刷関係の仕事をしています。
これならABでなくても、やり方次第でVBSでも出来るのでは?
>ただ、今度は「いつ終わったのか」を判断してウインドウを表示
>する必要が出てきました。f^^;
ユーザーに通知するだけなら、MSGBOXで通知してあげてください。
>ABのGUIでjperlを使うという方針には変わりはありません。perlに代わる
>「パターンマッチ」を持つ言語でも登場すれば鞍替えしたいところですが、
>今のところそれは無いようなのでjperlを使っています。必要に応じて
>CygwinのPerl5.8も利用しています。
>パピヨンさんは正規表現を使いたいがためにPerlを使っているのですよね。
>正規表現だけならBREGEXP.DLLを使えばABからでもなんでも使えますよ。
>これを考えてみるのもどうでしょうか。
やはりVBSでやっちゃってください。VBSなら正規表現が一応できます。
VBSはW2K以上ならインストール不要でしたよね>関係各位
# 私もABでこのような処理を行いたいのですが、
VBのように ActiveX・COM などの機能を楽に扱えないため、
未だにVB6で仕事用のユーティリティを作ってます。