「コマンドプロンプト」は非表示にできない?

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
パピヨン

「コマンドプロンプト」は非表示にできない?

#1 投稿記事 by パピヨン »

ABのGUIが好きで何とか自分の仕事に使おうと考えていますが、「Exec」関数を使ったくらいではうまく行かないことがわかりました。

過去ログで昔懐かしいバッチファイルにjperlを仕込んでGUI部分をABで作れば何とか「使える」ことを知りました。

ただ、この方法では思いっきり「コマンドプロンプト」が表示されてしまいます。実害は無いのでどうでもいいと言えばどうでもいいのですが、消す方法があればどなたか教えてもらえませんか?

ABのGUIでjperlを使うという方針には変わりはありません。perlに代わる「パターンマッチ」を持つ言語でも登場すれば鞍替えしたいところですが、今のところそれは無いようなのでjperlを使っています。必要に応じてCygwinのPerl5.8も利用しています。
hanchan
記事: 12
登録日時: 2005年7月27日(水) 10:12

Re: 「コマンドプロンプト」は非表示にできない?

#2 投稿記事 by hanchan »

> 過去ログで昔懐かしいバッチファイルにjperlを仕込んでGUI部分をABで作れば何とか「使える」ことを知りました。

どのように実行しているのでしょう?
DOS窓のEXEであれば「SW_HIDE」を使用すればウインドウは表示されません。

ShellExecute(hMainWnd,NULL,"C:\XXX.exe","",NULL,SW_HIDE) As Long
ゲスト

Re: 「コマンドプロンプト」は非表示にできない?

#3 投稿記事 by ゲスト »

> > 過去ログで昔懐かしいバッチファイルに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"

と、上記の内容をそのままバッチファイルの中に仕込んだわけです。
hanchan
記事: 12
登録日時: 2005年7月27日(水) 10:12

Re: 「コマンドプロンプト」は非表示にできない?

#4 投稿記事 by hanchan »

> perlの場合、
>
> jperl c:\prog\hello_world.pl hoge.txt >goho.txt
>
> というふうに、

こんな感じで行くと思います。
ShellExecute(hMainWnd,NULL,"C:\hoge.bat","",NULL,SW_HIDE)
パピヨン

Re: 「コマンドプロンプト」は非表示にできない?

#5 投稿記事 by パピヨン »

> > perlの場合、
> >
> > jperl c:\prog\hello_world.pl hoge.txt >goho.txt
> >
> > というふうに、
>
> こんな感じで行くと思います。
> ShellExecute(hMainWnd,NULL,"C:\hoge.bat","",NULL,SW_HIDE)


これで「コマンドプロンプト」は開かずに済むことを確認しました。
ありがとうございます。

ただ、今度は「いつ終わったのか」を判断してウインドウを表示
する必要が出てきました。f^^;
hira
記事: 203
登録日時: 2005年5月31日(火) 20:14
お住まい: 兵庫県
連絡する:

#6 投稿記事 by hira »

ただ、今度は「いつ終わったのか」を判断してウインドウを表示
する必要が出てきました。f^^;
ShellExecuteEx関数+GetExitCodeProcess関数の組み合わせでできるようです(手持ちのVB6APIの本より)。
SHELLEXECUTEINFO構造体にファイル名やパラメータ・動作名("open")を設定し、fMaskメンバにSEE_MASK_NOCLOSEPROCESSを指定してShellExecute関数を呼び出します。
そうすると構造体のhProcessメンバにプロセスハンドルが返されるので、これをGetExitCodeProcess関数(場合によって他の関数でもOK)の引数に指定して待機します。
詳しいコードは省略しますので調べてみてください。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#7 投稿記事 by イグトランス »

ちなみにリダイレクトの必要さえなければExec "jperl", "c:\prog\hello_world.pl hoge.txt"のようにすればできます。

さて、起動したプログラムが終了したかどうか検出をしたいときには
ShellExecuteやExecは残念ながら使えません。
CreateProcessやShellExecuteExでできるのですが、
後者はたしかABのインクルードファイル内に宣言がないので前者を使ってみます。
しかもCreateProcessにはリダイレクトの機能があります。これを使わないわけにはいきません。
肝はCreateProcessであり、WaitForSingleObjectが終了まで待つという動作を行います。
リダイレクトには「パイプ」を使ってファイルを通さずに直接読み取るようになっています。

たとえばこう使います。(私は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)
これは出力された内容の最初の256文字を読み出すように作ってあります。

と、ここまで書いたところで読み返してみて思ったのですが、
パピヨンさんは正規表現を使いたいがためにPerlを使っているのですよね。
正規表現だけならBREGEXP.DLLを使えばABからでもなんでも使えますよ。
これを考えてみるのもどうでしょうか。
パピヨン

#8 投稿記事 by パピヨン »

>
ただ、今度は「いつ終わったのか」を判断してウインドウを表示
> する必要が出てきました。f^^;
> ShellExecuteEx関数+GetExitCodeProcess関数の組み合わせでできるようです(手持ちのVB6APIの本より)。
> SHELLEXECUTEINFO構造体にファイル名やパラメータ・動作名("open")を設定し、fMaskメンバにSEE_MASK_NOCLOSEPROCESSを指定してShellExecute関数を呼び出します。
> そうすると構造体のhProcessメンバにプロセスハンドルが返されるので、これをGetExitCodeProcess関数(場合によって他の関数でもOK)の引数に指定して待機します。
> 詳しいコードは省略しますので調べてみてください。

さっそく昨日ShellExecuteの終了をどこかでつかまえられないかといろいろ
やってみましたができなかったんですね。(T_T)

今後、いろいろとやってみますがちょっと難しい話しになってきたという感
じです。詳しいやり方を教えていただいたのですが今のところ理解できてい
ません。申し訳ないです。
パピヨン

#9 投稿記事 by パピヨン »

> たとえばこう使います。(私は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)
> これは出力された内容の最初の256文字を読み出すように作ってあります。

具体的な記述をありがとうございます。
ただ、私の場合ABでファイルをread、writeする方法も理解していない
状態なのでちょっと時間がかかりそうです。

> と、ここまで書いたところで読み返してみて思ったのですが、
> パピヨンさんは正規表現を使いたいがためにPerlを使っているのですよね。
> 正規表現だけならBREGEXP.DLLを使えばABからでもなんでも使えますよ。
> これを考えてみるのもどうでしょうか。

すべてABでとも思いましたが、COBOL→AWK→Perlという経歴をたどって
きたものですからなかなか難しいのです。

データ「型」とかファイル読み込みのためのバッファを用意するという考え
がなかなかうまく利用できない点です。

「文字」を相手にする仕事(出版関係)なので今のところPerlがベストな
選択だと考えています。なぜ、ABなのかというと「コマンドプロンプト」
からスクリプトを実行する「やり方」にどうしてもアレルギーがある人も
多いので何とかできないものかと思っていたところ昨年ABの本に出会い
ました。このRADツールは「使える」と思っていたので思い切ってここで
質問してみたという次第です。

「HSP」とか「なでしこ」とか「WideStudio」もやろうとしてみましたが、
何とか形になったのはABのみでした。f^^;
流星

Re: 「コマンドプロンプト」は非表示にできない?

#10 投稿記事 by 流星 »

参考になれば…
・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で仕事用のユーティリティを作ってます。
返信する