[50717]  DOSソフト実行時のメッセージについて
投稿者:総額7600円 さん   2006-03-10 13:59:58
また古い話で恐縮です。というかかなり愚問なような気が・・・

DOSソフトを実行すると,そのソフトが実行されたことを示すメッセージが画面に表示されます。例えばHSB.EXEなら, High Speed Boot controller for 98 (以下略) というメッセージが出ます。これを表示されないようにしたいのです。
念願のハイパーフレームが入手できたので,QuickBASICのSHELL命令で付属のDOSの描画ソフトを起動するプログラムを作ってみたのですが,ハイパーフレームの画面からQuickBASICの画面に復帰する際に,画面が一瞬途切れるのです。低速マシンで動かしてみた結果,これは黒いDOS画面の一番上の行に当該ソフトの実行を示すメッセージが表示されるためとわかりました。全画面切り替えでなく,QB画面の中にハイパーフレームの画面を窓状にはめ込んだ場合でも状況は変わりません。
なんとかスムーズに画面の切り替えを行いたいのですが,うまい手はないものでしょうか。メッセージはDOSソフトに内蔵されているのでしょうから素人が削るのは無理かとも思いますが・・・
#同じ手法で綺麗に画面を切り替えていた人がいたらしいので,不可能ではないはずなのですが・・・
  1. ZJI さん   2006-03-10 22:36:46
    cttyコマンド使うのはだめでしょうか?
  2. かねやす さん   2006-03-11 02:18:10
    command.comの標準出力先を nul にすればいいんじゃないでしょうか。
    もはやdos時代のやったこと忘れてるんですが QBならたぶん
    run "command.com /C [対象ソフト] > nul"

    なんとかでは。
  3. 総額7600円 さん   2006-03-11 10:15:06
    どうもありがとうございます。
    (QBの)SHELL="[当該ソフト名] <NUL" でメッセージが表示されなくなりました。
    しかし相変わらずブラックアウトします。画面左上にも白い矩形が表示されます。
    メッセージなし画面を見て気づいたのですが,メッセージを表示している間も当該ソフトが実行されているんですね。
  4. 総額7600円 さん   2006-03-11 17:50:17
    う〜ん,どうしてもブラックアウトします。
    もしかしてマニュアルに記載のない資料が別紙で添付されていて,そっちに固有の解決法が書かれていたとかなのかなぁ・・・
  5. ぽん さん   2006-03-12 00:49:43
    >SHELL="[当該ソフト名] <NUL"
    これだと NUL値 を入力してしまうような…

    リダイレクトマーク("<"や">")は、向きにより
    「意味が全く異なります」ので 注意が必要ですよ。

    # "<" は入力値(元)指定
    # ">" は出力値(先)指定
  6. 総額7600円 さん   2006-03-12 08:02:30
    あぁごめんなさい。逆向き符号をタイプしてしまいました(汗
    ">"向きです。
  7. ウルトラギブン さん   2006-03-13 23:31:31
    >ブラックアウト
    COMMAND.COMの子プロセスとしてハイパーフレームを起動させているとしますと、ハイパーフレーム終了後に一度COMMAND.COMに制御が移りその後に親プロセスに復帰するのでは...そう考えますと「ブラックアウト=COMMAND.COMに制御が移った」と言うことで自然な流れに感じます。
    (このやり方では解決できなさそうな気がします.)

    それでふと頭に浮かんだのですがDOS5以降のタスク切替とかは使えないですかね。
    実際に可能かはわかりませんので本当に無責任モードで恐縮いたしますが、DOSSWAP.EXE辺りにヒントがあるかも...
    予め裏でハイパーフレームを起動しておいて、必要にむ応じて切り替える...とか。
    (...データの受け渡しは...あり?、コピペってできたかな...)

    これが駄目ならスマートさに欠けますが...
    QB側のプログラムにてテキスト・グラフィック両VRAMをQBとハイパーフレーム双方で取扱える形式で保存してハイパーフレームを終了する直前にVRAMに書き戻すと言うのは出来ませんでしょうか。
  8. ウルトラギブン さん   2006-03-14 23:39:40
    あ〜...でも、SHELL="[当該ソフト名]"の実態が"COMMAND.COM /C [当該ソフト名]"としたら結局両方とも無理そうですよねぇ...
    ちなみに「SHELL="CALL [当該ソフト起動用のバッチファイル]"」でも駄目でしょうか。
  9. 総額7600円 さん   2006-03-15 13:49:09
    ありがとうございます。
    バッチファイルを呼び出すようにしてみても同じでした。
    QB画面内でのウィンドウ表示を諦め,ハイパーフレーム画面だけを表示させるようにしてみたところ,画面の切り替え(予め表示領域外のVRAMに描画しておいた画像を表示領域内にコピー)に結構時間がかかり(1秒の何分の一とか何十分の一とかなんでしょうけれども),かつ付属DOSソフト実行時に画面が一瞬波打ちます。古い機械は何かと面倒なんですね・・・
    #付属のサンプルプログラムはうまく動くので,ボードが故障しているわけではないようです。
  10. ウルトラギブン さん   2006-03-16 23:05:25
    >予め表示領域外のVRAM
    あ、そうか。その手がありましたね(汗)。
    思い出してきました。
    コピーに時間がかかるとの事ですが、表示領域外のVRAMを使って画面分割機能(画面切替)を利用されてみたらいかがでしょうか(これならコピーしなくても良かった気が...)。
    確か画面最下行に表示されるFEPの切替え表示はこの方法を使っていたのではなかったでしたっけ。QBだと難しいのかな...
  11. MT さん   2006-03-17 14:36:29
    QuickBASICは、グラフィック機能との絡みで、起動・終了時とチャイルドプロセスの実行時に画面モードの変更を行っていたと記憶しています。これが原因ではないでしょうか?
    バージョン4.2と4.5で、このあたりの仕様に何か変更があったような気もしますが、かなり昔のことなので、よく覚えていません。
  12. 総額7600円 さん   2006-03-17 18:14:27
    どうもありがとうございます。
    >ウルトラギブンさん
    >画面分割機能
    調べてみます。
    >MTさん
    QBのバージョンは4.5です。実行後にメッセージを表示しないソフトがあれば,それをQBから呼び出してやることにより直接検証できるかもしれません。MAGとがGIFとか表示するソフトでそういうのがないか調べています。
  13. かねやす さん   2006-03-20 17:47:20
    何も表示しないプログラムなら自作すればいいんじゃないでしょうか([]内入力後return)。
    C>[debug]
    -[e 100]
    -[cd 20]
    -[n test.com]
    -[r cx]
    CX 0000:[2]
    -[r bx]
    BX 0000:[0]
    -[w]
    -[q]
    あとは自作でライブラリ作るかどっちかですね。最近DOS+QBなんてやってないので
    思い出せるか分かりませんが家に帰って漁ってみますわ〜。

  14. KAZZEZ さん   2006-03-20 20:13:00
    > 何も表示しないプログラムなら自作すればいいんじゃないでしょうか
    メモ帳などのテキストエディタで半角カナの「テ」を入力し、
    拡張子をCOMにしてセーブする、というのは邪道でしょうか?

    ちなみにIPLware type2の条件を満たしています。(^_^;)
  15. かねやす さん   2006-03-21 01:47:16
    何となく思い出した。
    用意するもの。masm5.1以降、link.exe(16ビット用)、lib.exe、QB45環境

    まず masm でqb45にアタッチするソースを書く。
    ----------------------------------------------------
    .model medium,basic
    .data
    parblk dw 7 dup (0)

    .code
    runexec proc a:word
    cld
    mov bx,a;String
    mov dx,word ptr [bx+2];buffer adrs
    ; mov cx,word ptr [bx] ;buffer size
    mov dx,si
    mov bx,offset parblk
    push es
    push ds
    pop es
    int 21h
    pop es
    ret
    runexec endp
    end
    ----------------------------------------------------
    アセンブルは
    masm %1 ;
    link /q %1 ,,,bqlb45
    lib %1 - %1 + %1 ;

    で、[%1].libが出来上がります。

    あとは、VBのライブラリにそのlib追加してソースに
    DECLARE FUNCTION runexec% (a$)

    と宣言して、内部で
    a%=runexec("c:,esthoge.exe")

    でOKなはず…
  16. かねやす さん   2006-03-21 01:49:54
    簡易ディレクティブ使ってるのでmasm4とかoptasm、tasmではダメな気がします。
    mov ax,4b00h
    int 21h
    の仕様がもしかしたら間違ってるかも(汗
  17. かねやす さん   2006-03-21 01:54:02
    ちうか、上のソースで mov ax,4b00h自体書き忘れてるじゃん、オレ…。ついでにVBじゃなくてQBでした。

  18. かねやす さん   2006-03-21 02:03:11
    さらに見たら、mov dx,si が不要です。下のでOKかな。

    .code
    runexec proc a:word
    cld
    mov bx,a;String
    mov dx,word ptr [bx+2];buffer adrs
    ; mov cx,word ptr [bx] ;buffer size
    mov bx,offset parblk  ;parameta block
    push es
    push ds
    pop es
    mov ax,4b00h
    int 21h
    pop es
    ret
    runexec endp
  19. かねやす さん   2006-03-21 02:06:28
    ひー、呼び出し側も間違っとる。

    a%=runexec("c:,esthoge.exe"+Chr$(0))

    です。
  20. 総額7600円 さん   2006-03-24 09:01:18
    詳細なご教授ありがとうございます。
    SHELL命令を使う限り,どうも瞬時ブラックアウトは避けられない模様ですので,別の手を考えなければならないなと思っています。
    HF3.LIBとHF3.Hというファイルが同梱されていることに気付きました。C言語のライブラリファイルとインクルードファイルのようです(Cのリンカ?用のバッチファイルらしきものもありましたので)。このライブラリファイルに,付属のDOSプログラムに相当するルーチンが含まれているようです。
    調べたらライブラリファイルはオブジェクトファイルの集合体ということですので,リンカでQBともくっつけられるのかもしれません。ライブラリファイルなんて使ったことがないので,どうやればいいのかはこれから調べないといけませんが・・・('A`;)
  21. かねやす さん   2006-03-26 00:33:38
    QBのライブラリ使用は難しくないです。起動時に「QB /L <ライブラリ名>」とやるだけでOK。
  22. 総額7600円 さん   2006-03-28 07:50:18
    QBのライブラリマネージャで件のCのライブラリファイルのモジュール操作(削除など)を試みましたが失敗しました。さすがにCを全然知らないでCのライブラリは使えないだろということで,Cの学習を開始しました。大変なことになりましたorz
  23. かねやす さん   2006-03-30 00:12:10
    もしかして、QC(Quick C)用のライブラリだったりして…。
  24. 総額7600円 さん   2006-03-30 09:26:49
    付属ライブラリは,Microsoft-C Ver6.0/7.0,TurboC Ver2.0,TurboC++ Ver1.0,Borland C++3.0に対応とあります。
    Borland Turbo C++4.0J for DOSというのが手に入りましたが,マニュアルが何を言っているのか全く分からぬorz
    こんな大変なことになるとは・・・('A`;)
    でもハイパーフレーム3は長く憧れのボードだったんで,なんとか頑張ってみます。