自殺プログラム-自らunload するfrm

このQ&Aのポイント
  • 自殺プログラムの作成に成功しました。
  • タイマー条件付きのMsgBox関数モドキの作成に成功しました。
  • MsgBoxModoki.frmの命令や検索語についての知識がありません。
回答を見る
  • ベストアンサー

自殺プログラム-自らunload するfrm

言語 Visual Basic 6.0(SP5) 自殺プログラム-条件が成立したら自分自身を消去するプログラム-として タイマー条件付 「MsgBox 関数」モドキを作りたい(実際に作る内容はオーバーレイプログラムとして通信関係資源を含む外部資源の操作等も含みます)のですが 経過時間表示をしない「MsgBox 関数モドキ」 と タイマーで終了(unload)せず手作業が必須な「MsgBox 関数モドキ」(非表示には成功しました) と 親frmまで殺す「MsgBox 関数モドキ」 の作成には成功しました。 MsgBoxModoki.Show 等で参照した MsgBoxModoki.frm が 1.手作業を伴わずに何かしらの表示を伴う手続きを実行する命令(ヘルプメッセージの検索用語すらわかりません)等 2.自らunloadするようにする命令等 ご存知の方いらっしゃいませんか。いらっしゃったらば命令や検索語をお知らせください。

質問者が選んだベストアンサー

  • ベストアンサー
  • Senna_FF
  • ベストアンサー率45% (153/334)
回答No.1

1.タイマ処理のことでしょうか?違ってたら回答にならないのですが、   Timerオブジェクトを使用してタイマイベントを発生させ、そのイベントメソッド内で処理を記述する。   (Timerオブジェクトでヘルプ検索) 2.MsgBoxModoki.frm が発行する命令という解釈で、   "Unload Me"   (そういうことを質問されているのではないですか?) ※見当違いなことをいってたら無視してください。

aramananto
質問者

お礼

Unload Me 等Unload の処理は Form_QueryUnload() Form_Unload() Form_Terminate() の順番で発生するようです。 Unload()の処理中に Sub Form_QueryUnload(適当に) if (タイマー処理フラグ) then 強制終了フラグ = True Cancel = 1 end sub Sub Form_Unload() Timer.Enabled = False: 'Timer動作停止 end sub Sub Timer_Timer() if (タイマー処理フラグ) then exit sub タイマー処理フラグ = True call 適当な処理 タイマー処理フラグ = False if (強制終了フラグ) then  Timer.Enabled = False: 'Timer動作停止 unload Me end if end sub Sub 適当な処理 do call 適当にpingの実行 DoEvents  if (強制終了フラグ) then Call TCP/IPの終了処理: exit do loop (ping が通るまで待つ) end sub のように 1.Unloda処理ルーチン内でタイマーが動作している場合(Sub 適当な処理内DoEventの処理としてUnload処理が開始された場合)にはunloadを中断し、強制終了フラグを立てる 2.タイマー処理ルーチン内で強制終了フラグを見て処理を中断し 3.タイマー処理内に戻ったところでタイマーを終了して 4.再度unload が実行されるのをひたすら待つ。自らunload できる場合があるのでunload を一応かけておく。 5.unloadが失敗することがある(TCP/IPの終了処理が失敗した場合など)ので親formでもう一回unloadを実行する(TCP/IPが正常終了したことを信じで) の処理が必要なようです。 特権命令を使える普通のマルチタスクならば、タイマー処理であろうとも何であろうとも特権命令を自ら実行する(一般ユーザーであっても自分自身に対しては特権命令が実行可能)のですがWindows では終了命令を自ら検出して正常終了する必要があるようです。これでは、ハングアップが多いのも納得できます。 それらしきソフトが完成しました。なおSP5を使用しています。SP6ではTCP/IPサーバーソフトが動きませんので。

aramananto
質問者

補足

6割がた解決しました。 終了処理関係の情報がわかりません。 Timer処理内ルーチンで事象待ち状態(例.DNSにアクセスし接続先IP番号を決定するまでの最大20秒間, 相手先IPにECHOを送り応答があるまでの約0.3秒*4回等)にあるときに 左上「X」を使用した強制終了をオペレーターが命じるとUnload等のルーチンに移動します。 Unload 内で Timer1.E(なんとか)=Faile を実行してもTimer処理ルーチンの最後のExit sub又はEnd SUb が実行されるまで処理が継続します。終了処理として関係ファイルのClose等を先に実行してしまう等の関係でエラー処理から無限ループに陥ってイます。 結果としてUnload後もTimer処理ルーチンが生き残っています。親FormからのUnload命令でもTimer処理が停止しません。適当なところでV.B.の実行をブレークポイントでとめて追跡した結果いじょうの内容が判明しました。 待ち状態にないのであれば簡単にとまります。

関連するQ&A

  • フォームファイル(.frm)を開いて文字列検索を行いたい

    フォームファイルから関数名をとりだして テキストファイルに書き出したいと思っています。 そこで・・ テキストエディタ(メモ帳)に、 フォームファイル(.frm)をドラックアンドドロップ すると内容がテキスト表示されますよね。 この処理をプログラムですることは可能でしょうか? そうすれば、あとは「Public」や「Fanction」などの文字で マッチングしていけばいいと考えているのですが。。 すいませんが宜しくお願いします。

  • 終了してもプログラムが実行したまま(VB)

    非常に時間のかかる繰り返し処理を行なうプログラムを作りました。どのくらい、プログラムが進行しているのかわかりやすくするため、 Progress.Show でProgressという名前のフォームを表示し、そこに、プログラムが何%終わったのか表示するようにしました。 プログラムはDo Loop文が使ってあるので、何%終わったのかを表示するためにLoopした回数を取得して、それをフォームに表示することにしましたが、どこかで調べたら機械は、Do Loopのあいだはフォーム上に文字を表示するのに手が回らないからDoEventsを使ってイベントを実行させなさい、といわれました。 そこまではうまくいきました。プログラムを実行すると、プログラムが実行されて何%終わったかもちゃんと表示できるようになりました。 ところが、プログラムの実行中にフォームの右上の×ボタンを押したところ、フォームは画面から消え、プログラムが終了したように見えるのに、VB Editorでは[実行中]となっており、終わってくれません。ずっとDo Loopが実行されたままです。 Private Sub Form_Terminate() のところに Unload Progress と書いても、「Unloadメソッドは使えません」などというエラー・メッセージが出ます。(フォーム上にボタンを置き、そこをクリックするとUnloadするようにしてみましたがやはり同じことを言われました。) 原因は何でしょうか? フォームをUnloadする、ということの意味をちゃんと理解していないのでいけないのだと思うのですが、調べてもよく言っていることがわかりません。 よろしくお願いします。

  • EXCELでプログラム処理をしたいです。

    下記の条件で プログラム処理をしたいです。  (1)出題文章どおりにIPさせてその時間を測る。  (2)出題通りのIPでなければ先には進めない。  (3)10問完了した時点の分秒をタイマー表記。   昔ベーシックでは可能でした。 Excelの IF 関数でプログラム 出来そうなんですが??  識者様教えて頂けませんでしょうか?

  • プログラムタイマーを探しています。

    昔買ったオーディオ用のタイマーの調子が 最近あまり良くないので、 新しい物を買おうと思いますが、 インターネットで検索しても 製品の機能が詳しく表示されていないので、 どれを買えば良いか分かりません。 現在使っているソニーのプログラムタイマーは 1985年頃購入したPT-D555ES で これは プログラム予約が7つ ACアウトレットは 連動3系統(A,B,C.)5個、 非連動1個 です。 これくらいの機能が備わっている物が希望です。 値段は2万円以下が良いのですが、 高くても構いません。 どなたか具体的な商品名(型番)や、 入手方法(地方に住んでいるので通販を希望)を 紹介して下さいませんか? 現在一般的に入手可能な物に限ります。 「もう昔あった様なプログラムタイマーは作られていない」 の様な話も聞きますので、 オーディオに詳しい方、どうかアドバイスを! よろしくお願い致します。

  • V.B.6 多重Call用スプール作成等について。

    複数のタイマー割り込み(A,B,C,...)が存在する時 各割り込みルーチンから共通のライブラリ Eesasa を使用する場合 Visual Basic 6.0 SP5 内部ルーチンにおける資源の取り扱いに関する ヘルプファイルの内容を読みたいのですが、検索語がわかりません。 対応するヘルプファイル名又は適切なシソーラスをお教えください。 想定するルーチンは以下のとおりです。 ファイル a.frm, b.frm, c.frm,... Private Sub Form_load Timer1.Enabled=True end sub Private Sub Timer1_Timer() IF (適当な条件) then call Eesasa end sub ファイル EesasaSub.Bas sub Eesasa  (適当な処理) end sub A.frm,...と EesasaSUB.bas は同一プロジェクトに属します。 Eesasa の処理中に別の割り込みがかかった場合後から発生した割り込みがEesasaを参照することについて Eesasa 内で待ちループをかけるか Eesasa の入り口ではじき各Frmファイル内で待ちループをかけるか Eesasa とは別名の短時間処理ルーチンを作成しフラグを返す。各Frmファイル内で待ちループをかけるか Eesasa 処理中のフラグを EsasaSub.bas 内にもてるか レジストリ等外部資源に保存する必要があるか 別タスクにして EEsasa.exe を起動する(http://oshiete1.goo.ne.jp/kotaeru.php3?q=727770等)必要があるか。 ユーザー側が上記のような資源の占有・解放を宣言し待ちルーチンを作成するか Visual Basic 6.0 SP5 が  資源関係を意識しないで済むような処理になっているか  専用の資源占有開放命令を持っているか がわからないのです。 Eesasa の処理終了まで割り込みを禁止する方法は使えません。 Eesasa の処理に1回あたり短いもので1-3秒・長いもので3-8時間かかります。 しかも中断処理が存在します(10分以上長い処理に付き合いきれないので処理を中断して待ち行列の最後につなぎたい)。

  • Cプログラムの全関数にプログラムを自動挿入したい

    C言語で作成したプログラムの全ての関数に対して、各関数のオート変数の宣言の前(関数の先頭)に特定のオート変数の宣言(例: int a=0xff)を自動で挿入したいです。 関数の数が多いので手作業以外の方法で良い方法はないでしょうか?

  • javaで辞書プログラムを作りたい.

    javaで検索したら意味を返すプログラムを作りたいです。 検索した言葉の意味を返すときってどういう処理が適切でしょうか? 僕が作りたいのは、本当にどういう言葉でも意味を返したい。 そうすると、googleの力を借りればいいのかなと思いました。 ざっくりきくと 例えばプログラム内で入力処理を受け、googleに渡して、検索してもらい、その情報をプログラム結果として表示するためにはどうすればいいでしょうか? 僕の作りたいプログラムはそこから少し手を加えたものです。が、上記のやりかたがわかりません。教えて下さい。

    • ベストアンサー
    • Java
  • 画像に文字をプログラムで埋め込む

    画像処理はしたことがなくこの方面の知識が無いです。 JPGファイルの隅に、数文字をプログラムで埋め込みたいです。2、3百枚くらいなので、1枚ずつ手作業というのは避けたいです。 どういうライブラリを使うのが良いでしょうか? 言語はRuby/Pythonくらいだとありがたいです。 もしプラットフォーム依存のライブラリの場合はWIndowsかLinuxで。 プログラムを自分で書くのではなく、そういう機能のあるWindowsアプリがあるのならそれでもいいです。 検索しても、ファイル名のリネームのことだったり、手作業のことだったりで、ノイズが多くてちょっと探せません。

  • MsgBox表示中のタイマーイベント

    VB6についての質問です。 MsgBox関数でメッセージBOXを表示させると、それが処理されるまで他のイベント(タイマーイベント)って発生しませんよね? 発生させようとしたら、自作のメッセージBOXを使うしかないでしょうか?

  • エクセル2000でカレンダーをつくりたいのですが・・。

    エクセル2000を使って1年分のカレンダーを作りたいと考えています。土日は条件付き書式を使って曜日の色を変えることができたのですが、祝日はどのような関数または命令をあたえれば検索または表示を変えることができますか。何か簡単な方法があれば教えてください。

専門家に質問してみよう