ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月28日(日) 03:14

全ての表示時間は UTC+09:00 です




新しいトピックを投稿する  トピックへ返信する  [ 10 件の記事 ] 
作成者 メッセージ
投稿記事Posted: 2005年11月15日(火) 11:16 
ABのGUIが好きで何とか自分の仕事に使おうと考えていますが、「Exec」関数を使ったくらいではうまく行かないことがわかりました。

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

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

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


通報する
ページトップ
   
投稿記事Posted: 2005年11月15日(火) 11:58 
オフライン

登録日時: 2005年7月27日(水) 10:12
記事: 12
> 過去ログで昔懐かしいバッチファイルにjperlを仕込んでGUI部分をABで作れば何とか「使える」ことを知りました。

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

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


通報する
ページトップ
投稿記事Posted: 2005年11月15日(火) 12:32 
> > 過去ログで昔懐かしいバッチファイルに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"

と、上記の内容をそのままバッチファイルの中に仕込んだわけです。


通報する
ページトップ
   
投稿記事Posted: 2005年11月15日(火) 13:12 
オフライン

登録日時: 2005年7月27日(水) 10:12
記事: 12
> perlの場合、
>
> jperl c:\prog\hello_world.pl hoge.txt >goho.txt
>
> というふうに、

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


通報する
ページトップ
投稿記事Posted: 2005年11月15日(火) 14:23 
> > perlの場合、
> >
> > jperl c:\prog\hello_world.pl hoge.txt >goho.txt
> >
> > というふうに、
>
> こんな感じで行くと思います。
> ShellExecute(hMainWnd,NULL,"C:\hoge.bat","",NULL,SW_HIDE)


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

ただ、今度は「いつ終わったのか」を判断してウインドウを表示
する必要が出てきました。f^^;


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年11月15日(火) 19:58 
オフライン

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

_________________
[hira]
http://hira.hopto.org/


通報する
ページトップ
 記事の件名:
投稿記事Posted: 2005年11月15日(火) 22:17 
オフライン

登録日時: 2005年5月31日(火) 17:59
記事: 899
お住まい: 東京都
ちなみにリダイレクトの必要さえなければ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からでもなんでも使えますよ。
これを考えてみるのもどうでしょうか。


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

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

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


通報する
ページトップ
   
 記事の件名:
投稿記事Posted: 2005年11月16日(水) 11:36 
> たとえばこう使います。(私は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^^;


通報する
ページトップ
   
投稿記事Posted: 2005年11月16日(水) 20:22 
参考になれば…
・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で仕事用のユーティリティを作ってます。


通報する
ページトップ
   
期間内表示:  ソート  
新しいトピックを投稿する  トピックへ返信する  [ 10 件の記事 ] 

全ての表示時間は UTC+09:00 です


オンラインデータ

このフォーラムを閲覧中のユーザー: Bing [Bot] & ゲスト[13人]


トピック投稿:  可
返信投稿:  可
記事編集: 不可
記事削除: 不可
ファイル添付: 不可

検索:
ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean