iPhone5/iPad4/iPad mini | 無線プリンタ | ネットワーク | データセンター用語 | Netscreen/Juniper |
[ ミニミニ管理者の独り言 > プログラム開発(VB6) > VB6.0でSHELL関数の実行終了を待つ方法 ]
スポンサードリンク
VB6.0でSHELL関数の実行終了を待つ方法
私は、VB6.0でSHELL関数をよく利用しますが、SHELL関数の問題点(?)としては「他の実行モジュールを起動するだけ」ですので、その後の処理は「実行モジュールまかせ」ということです。これが原因で、実行モジュールの処理が「失敗」したり、「応答時間がかかってタイムアウト」していても「一向にお構いなし」状態で、次々にコマンドを実行していきます。
そのため、SHELL関数を立て続けに実行させると「処理が実行されなかったり」「途中の処理が抜けていたり」することがあるのもこのためです。
この状況を回避する方法として「SHELL関数の実行終了を待ってから次の処理に進む」様にする方法があります。
◆サンプルプログラム
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
'WindowsAPIを宣言する
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const SYNCHRONIZE = &H100000
Private Const INFINITE = &HFFFF
'SHELL関数の実行終了を待つ処理(モジュール)
Public Function Exec(pathname As String,windowstyle As Variant)
Dim IDProcess As Long
Dim hProcess As Long
Dim Ret As Long
IDProcess = Shell(pathname, windowstyle)
hProcess = OpenProcess(SYNCHRONIZE, 1, IDProcess)
Ret = WaitForSingleObject(hProcess, INFINITE)
Ret = CloseHandle(hProcess)
End Function
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
使用方法はSHELL関数と同じで、他のオブジェクト(フォームやコマンドボタン)などから「Execモジュール」を呼び出して、「pathname」のところでコマンドラインを指定して、「windowstyle」のところで引数を指定します。
◆検証環境
・Windows2000Pro
・Visual Basic 6.0
システム管理者必見!DOSの活用事例
◆VisualBasic6.0 バックナンバー◆
・VB6.0でコンソールアプリケーションを作る!
VB6.0でコンソールアプリケーション(フォームの無いプログラム)を作成する方法を解説しています。
・VB6.0でコマンドプロンプトのコマンドを実行する(SHELL関数)
VB6.0の「SHELL関数」の使い方について解説しています。
・VB6.0でSHELL関数の実行終了を待つ方法
VB6.0でSHELL関数を使用した時に発生する処理モレの解決するサンプルプログラムです。
最新記事へ トップページ
そのため、SHELL関数を立て続けに実行させると「処理が実行されなかったり」「途中の処理が抜けていたり」することがあるのもこのためです。
この状況を回避する方法として「SHELL関数の実行終了を待ってから次の処理に進む」様にする方法があります。
◆サンプルプログラム
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
'WindowsAPIを宣言する
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const SYNCHRONIZE = &H100000
Private Const INFINITE = &HFFFF
'SHELL関数の実行終了を待つ処理(モジュール)
Public Function Exec(pathname As String,windowstyle As Variant)
Dim IDProcess As Long
Dim hProcess As Long
Dim Ret As Long
IDProcess = Shell(pathname, windowstyle)
hProcess = OpenProcess(SYNCHRONIZE, 1, IDProcess)
Ret = WaitForSingleObject(hProcess, INFINITE)
Ret = CloseHandle(hProcess)
End Function
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
使用方法はSHELL関数と同じで、他のオブジェクト(フォームやコマンドボタン)などから「Execモジュール」を呼び出して、「pathname」のところでコマンドラインを指定して、「windowstyle」のところで引数を指定します。
◆検証環境
・Windows2000Pro
・Visual Basic 6.0
システム管理者必見!DOSの活用事例
◆VisualBasic6.0 バックナンバー◆
・VB6.0でコンソールアプリケーションを作る!
VB6.0でコンソールアプリケーション(フォームの無いプログラム)を作成する方法を解説しています。
・VB6.0でコマンドプロンプトのコマンドを実行する(SHELL関数)
VB6.0の「SHELL関数」の使い方について解説しています。
・VB6.0でSHELL関数の実行終了を待つ方法
VB6.0でSHELL関数を使用した時に発生する処理モレの解決するサンプルプログラムです。
最新記事へ トップページ
スポンサードリンク
■Blog Ranking■
1. ←←サーバー構築・運用ブログあり お奨め:★★★★★
2. (ブログランキング ドット ネット)
3.にほんブログ村
4.BS blog Ranking
ブログランキングに挑戦中です。あなたもブログランキングに挑戦してみよう!
※サーバー構築・運用ブログなんかもありますのでシステム管理者の方にもお奨めのサイトがあり!
iPhone5/iPad4/iPad mini | 無線プリンタ | ネットワーク | データセンター用語 | Netscreen/Juniper |
[ ミニミニ管理者の独り言 > プログラム開発(VB6) > VB6.0でコマンドプロンプトのコマンドを実行する(SHELL関数) ]
スポンサードリンク
VB6.0でコマンドプロンプトのコマンドを実行する(SHELL関数)
VB6.0でコマンドプロンプトのコマンドを実行できると楽に処理できることが多いです。
今回は、「SHELL関数を利用してコマンドプロンプトのコマンドを実行させる方法 」を紹介します。
まず、VB6.0のSHELL関数の文法を記載すると
Shell "pathname"[,windowstyle]
※[ ]内はオプショナルのため、省略可能です。
となっており、「pathname」のところでフルパス(ファイルパス+ファイル名)を指定します。また、「windowstyle」のところでは下記の値の何れかを指定する事ができます。
1)vbHideまたは、0
フォーカスを持ち、非表示にされるウィンドウ
2)vbNormalFocusまたは、1
フォーカスを持ち、元のサイズと位置に復元されるウィンドウ
3)vbMinimizedFocusまたは、2
フォーカスを持ち、最小化表示されるウィンドウ
4)vbMaximizedFocusまたは、3
フォーカスを持ち、最大化表示されるウィンドウ
5)vbNormalNoFocusまたは、4
最後にウィンドウを閉じたときのサイズと位置に復元されるフォーカスを持たないウィンドウ。現在アクティブなウィンドウは、アクティブのままです。
6)vbMinimizedNoFocusまたは、6
最小化表示されるフォーカスを持たないウィンドウ。現在アクティブなウィンドウは、アクティブのままです。
ここで参考例を示すと
Shell "C:¥WINNT¥CALC.EXE", vbNormalFocus
となりますが、コマンドの引数を指定すると正しく動作しないことがあります。
例えば
Shell "C:¥WINNT¥System32¥ipconfig /all > c:¥ipconfig.log", vbHide
と実行しても「C:¥ipconfig.log」ファイルは作成されません。
この場合は、コマンドプロンプトを指定してコマンドを実行するとうまくいきます。
コマンドプロンプトを利用 してコマンドを実行する場合を紹介します。
Shell "cmd.exe /c ipconfig /all > c:¥ipconfig.log", vbHide
解説すると、初めの「cmd.exe /c」では、「コマンドプロンプトを起動して実行する」ことを指定して、引数「/c」にて「コマンド実行後、コマンドプロンプトを終了する」様にしています。次に「ipconfig /all」では「ネットワークの設定を全て表示する」様にしています。最後に「> c:¥ipconfig.log」では、「ipconfigの実行結果を指定したファイルに出力する」様にしています。
◆検証環境
・Windows2000Pro
・Visual Basic 6.0
システム管理者必見!DOSの活用事例
◆VisualBasic6.0 バックナンバー◆
・VB6.0でコンソールアプリケーションを作る!
VB6.0でコンソールアプリケーション(フォームの無いプログラム)を作成する方法を解説しています。
・VB6.0でコマンドプロンプトのコマンドを実行する(SHELL関数)
VB6.0の「SHELL関数」の使い方について解説しています。
・VB6.0でSHELL関数の実行終了を待つ方法
VB6.0でSHELL関数を使用した時に発生する処理モレの解決するサンプルプログラムです。
ポイントサイトで効率的に稼ぐ方法を紹介!
最新記事へ トップページ
スポンサードリンク
■Blog Ranking■
1. ←←サーバー構築・運用ブログあり お奨め:★★★★★
2. (ブログランキング ドット ネット)
3.にほんブログ村
4.BS blog Ranking
ブログランキングに挑戦中です。あなたもブログランキングに挑戦してみよう!
※サーバー構築・運用ブログなんかもありますのでシステム管理者の方にもお奨めのサイトがあり!
iPhone5/iPad4/iPad mini | 無線プリンタ | ネットワーク | データセンター用語 | Netscreen/Juniper |
[ ミニミニ管理者の独り言 > プログラム開発(VB6) > VB6.0でコンソールアプリケーションを作る! ]
スポンサードリンク
VB6.0でコンソールアプリケーションを作る!
今回は、Visual Basic 6.0でコンソールアプリケーションを作る方法をご紹介します。
と言うか、最近はコンソールアプリケーションを作ることが少なくなったので忘れてしまうこともあるので、簡単にまとめました。
そもそも、「コンソールアプリケーション」って何?と言う方もいらっしゃるかもしれないので簡単に説明しておきます。
コンソールアプリケーション(console application)とは「キャラクター・ユーザー・インターフェース(CUI)において、コマンドラインから実行するアプリケーション」の事を指します。Windowsで言う「コマンドプロンプト」、いわゆる黒い背景の「DOS窓」のことです。コンソールアプリケーションはウィンドウアプリケーション(window application)とは異なり、マウス操作は必要ありません。全てキーボードからコマンドを入力して処理します。
一般的には「コマンド名 引数」といった形式で、コマンドプロンプトに入力して実行します。例を挙げると「Ping」などがこれに当てはまります。
c:¥>ping 192.168.0.1
コマンド名:ping
引 数:192.168.0.1
ここで本題に話を戻すと、Visual Basic 6.0でコンソールアプリケーションを作るのは簡単です。
手順としては。
1)プロジェクトを作成します。
標準EXEを選択します。
2)標準モジュールで「Sub Main」に実行する内容を記述します。
Public Sub Main()
End Sub
3)プロジェクト−Project1のプロパティ−スタートアップの設定で「Sub Main」を選択。
作業はこれだけです。結構簡単です。
また、作成したEXEをコマンドプロンプトから呼び出しする時に引数を指定(コマンド名の後にスペースを空けて値を入力)するとその値は「Command」に格納されます。
このCommandの値を参照して処理を分岐したり組み込みすれば引数をうまく利用できます。
◆検証環境
・Windows2000Pro
・Visual Basic 6.0
◆VisualBasic6.0 バックナンバー◆
・VB6.0でコンソールアプリケーションを作る!
VB6.0でコンソールアプリケーション(フォームの無いプログラム)を作成する方法を解説しています。
・VB6.0でコマンドプロンプトのコマンドを実行する(SHELL関数)
VB6.0の「SHELL関数」の使い方について解説しています。
・VB6.0でSHELL関数の実行終了を待つ方法
VB6.0でSHELL関数を使用した時に発生する処理モレの解決するサンプルプログラムです。
最新記事へ トップページ
と言うか、最近はコンソールアプリケーションを作ることが少なくなったので忘れてしまうこともあるので、簡単にまとめました。
そもそも、「コンソールアプリケーション」って何?と言う方もいらっしゃるかもしれないので簡単に説明しておきます。
コンソールアプリケーション(console application)とは「キャラクター・ユーザー・インターフェース(CUI)において、コマンドラインから実行するアプリケーション」の事を指します。Windowsで言う「コマンドプロンプト」、いわゆる黒い背景の「DOS窓」のことです。コンソールアプリケーションはウィンドウアプリケーション(window application)とは異なり、マウス操作は必要ありません。全てキーボードからコマンドを入力して処理します。
一般的には「コマンド名 引数」といった形式で、コマンドプロンプトに入力して実行します。例を挙げると「Ping」などがこれに当てはまります。
c:¥>ping 192.168.0.1
コマンド名:ping
引 数:192.168.0.1
ここで本題に話を戻すと、Visual Basic 6.0でコンソールアプリケーションを作るのは簡単です。
手順としては。
1)プロジェクトを作成します。
標準EXEを選択します。
2)標準モジュールで「Sub Main」に実行する内容を記述します。
Public Sub Main()
End Sub
3)プロジェクト−Project1のプロパティ−スタートアップの設定で「Sub Main」を選択。
作業はこれだけです。結構簡単です。
また、作成したEXEをコマンドプロンプトから呼び出しする時に引数を指定(コマンド名の後にスペースを空けて値を入力)するとその値は「Command」に格納されます。
このCommandの値を参照して処理を分岐したり組み込みすれば引数をうまく利用できます。
◆検証環境
・Windows2000Pro
・Visual Basic 6.0
◆VisualBasic6.0 バックナンバー◆
・VB6.0でコンソールアプリケーションを作る!
VB6.0でコンソールアプリケーション(フォームの無いプログラム)を作成する方法を解説しています。
・VB6.0でコマンドプロンプトのコマンドを実行する(SHELL関数)
VB6.0の「SHELL関数」の使い方について解説しています。
・VB6.0でSHELL関数の実行終了を待つ方法
VB6.0でSHELL関数を使用した時に発生する処理モレの解決するサンプルプログラムです。
最新記事へ トップページ
スポンサードリンク
■Blog Ranking■
1. ←←サーバー構築・運用ブログあり お奨め:★★★★★
2. (ブログランキング ドット ネット)
3.にほんブログ村
4.BS blog Ranking
ブログランキングに挑戦中です。あなたもブログランキングに挑戦してみよう!
※サーバー構築・運用ブログなんかもありますのでシステム管理者の方にもお奨めのサイトがあり!
iPhone5/iPad4/iPad mini | 無線プリンタ | ネットワーク | データセンター用語 | Netscreen/Juniper |
[ ミニミニ管理者の独り言 > プログラム開発(VB6) > サーバーの監視プログラム ]
スポンサードリンク
サーバーの監視プログラム
今度、サーバーの監視プログラムを開発しようかと思っています。
理由は簡単で、ミニミニ管理者(社内SE)が管理しているWebサーバが最近落ちていることがあったからです。(もしかして狙われている?F5攻撃?)
この現象は、Webサーバーをリプレースした際にWindows2000Server(IIS5.0)からWindowsServer2003(IIS6.0)へ移行してから発生しています。このWebサーバー上では、他にSMTPとPOP3が稼動していますので、一緒に道連れで落ちていました。(トホホ)
WindowsServerでWeb公開しているのである程度気をつけてセキュアな設定にしていましたが、ダメ(?)なようです。
もしくは設定の問題か?とも思っています。その理由は月に一度メンテナンスとしてリブート(再起動)してやると発生しないからです。(設定箇所はテスト中です。)
いずれにしてもWebサーバが落ちる現象はあってはならないので、「Webサーバを定期的に自動監視」するプログラムを開発しようと考えています。
開発環境は、「Visual Basic 6.0」
です。というかこれしか能がありません。
主な監視機能としては下記を検討しています。
1)リモートでの監視
ping監視
ポート監視
サービス/稼働監視
改ざん検知
2)エージェントによる監視
リソース監視
てな感じです。
概略としては...
まず、「リモート監視」は1分おきのタイマーで「Ping」を発行して死活管理を行い、3回連続で失敗したらメールにてシステム管理者宛てに通知(もちろんリモート環境側でメールサーバを別途構築します)するというものです。
また、この機能はネットワークの疎通監視プログラムとしても利用したいと考えていますのでモジュール間結合度を出来るだけ低くして汎用性を上げたいと思っています。
「Visual Basic 6.0」で、直接、pingを発行した際の応答を受信するのは、グレープシティの「iNetSuite 1.0J」を利用してやりたいと思います。(TCP/IPの通信を1からやる方法がわからないのと分かってもやりたくない?)
次の「ポート監視」は、Webサーバーの80番ポートにアクセス出来るかを監視します。
これは次の「サービス/稼働監視」と一緒に行なう事になると思います。
そして、「サービス/稼働監視」は、Webサーバーの80番ポートにアクセスして、HTTPのGETコマンドにて正確に通信できているかを監視します。これもグレープシティの「iNetSuite 1.0J」を利用しようと考えてます。
「改ざん検知」ですが、これはTOPページのHTMLをGETしたデータと予め用意していたHTMLの内容を比較して監視したいと思います。
これはVB6.0の「Inetコンポーネント」を利用してやるつもりです。
エージェントによる監視の「リソース監視」は、以前開発した「CPU」「RAM」「HDD」を定期的に監視してしきい値を超えた場合にメールにてシステム管理者へ通知するプログラムを開発しているので、これを利用したいと考えています。
あと、出来れば、システム管理者からの能動的(タスクの実行など)なアクションでサーバーのスクリーンショットを取るような仕組みも検討したいなと思います。
いずれにしてもいまは時間を見て「一人要件定義」段階です。
開発がはじまったらまたご紹介します。
最新記事へ トップページ
理由は簡単で、ミニミニ管理者(社内SE)が管理しているWebサーバが最近落ちていることがあったからです。(もしかして狙われている?F5攻撃?)
この現象は、Webサーバーをリプレースした際にWindows2000Server(IIS5.0)からWindowsServer2003(IIS6.0)へ移行してから発生しています。このWebサーバー上では、他にSMTPとPOP3が稼動していますので、一緒に道連れで落ちていました。(トホホ)
WindowsServerでWeb公開しているのである程度気をつけてセキュアな設定にしていましたが、ダメ(?)なようです。
もしくは設定の問題か?とも思っています。その理由は月に一度メンテナンスとしてリブート(再起動)してやると発生しないからです。(設定箇所はテスト中です。)
いずれにしてもWebサーバが落ちる現象はあってはならないので、「Webサーバを定期的に自動監視」するプログラムを開発しようと考えています。
開発環境は、「Visual Basic 6.0」
です。というかこれしか能がありません。
主な監視機能としては下記を検討しています。
1)リモートでの監視
ping監視
ポート監視
サービス/稼働監視
改ざん検知
2)エージェントによる監視
リソース監視
てな感じです。
概略としては...
まず、「リモート監視」は1分おきのタイマーで「Ping」を発行して死活管理を行い、3回連続で失敗したらメールにてシステム管理者宛てに通知(もちろんリモート環境側でメールサーバを別途構築します)するというものです。
また、この機能はネットワークの疎通監視プログラムとしても利用したいと考えていますのでモジュール間結合度を出来るだけ低くして汎用性を上げたいと思っています。
「Visual Basic 6.0」で、直接、pingを発行した際の応答を受信するのは、グレープシティの「iNetSuite 1.0J」を利用してやりたいと思います。(TCP/IPの通信を1からやる方法がわからないのと分かってもやりたくない?)
次の「ポート監視」は、Webサーバーの80番ポートにアクセス出来るかを監視します。
これは次の「サービス/稼働監視」と一緒に行なう事になると思います。
そして、「サービス/稼働監視」は、Webサーバーの80番ポートにアクセスして、HTTPのGETコマンドにて正確に通信できているかを監視します。これもグレープシティの「iNetSuite 1.0J」を利用しようと考えてます。
「改ざん検知」ですが、これはTOPページのHTMLをGETしたデータと予め用意していたHTMLの内容を比較して監視したいと思います。
これはVB6.0の「Inetコンポーネント」を利用してやるつもりです。
エージェントによる監視の「リソース監視」は、以前開発した「CPU」「RAM」「HDD」を定期的に監視してしきい値を超えた場合にメールにてシステム管理者へ通知するプログラムを開発しているので、これを利用したいと考えています。
あと、出来れば、システム管理者からの能動的(タスクの実行など)なアクションでサーバーのスクリーンショットを取るような仕組みも検討したいなと思います。
いずれにしてもいまは時間を見て「一人要件定義」段階です。
開発がはじまったらまたご紹介します。
最新記事へ トップページ
スポンサードリンク
■Blog Ranking■
1. ←←サーバー構築・運用ブログあり お奨め:★★★★★
2. (ブログランキング ドット ネット)
3.にほんブログ村
4.BS blog Ranking
ブログランキングに挑戦中です。あなたもブログランキングに挑戦してみよう!
※サーバー構築・運用ブログなんかもありますのでシステム管理者の方にもお奨めのサイトがあり!