tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル Re: vb6での標準出力
投稿日: 2017/09/29(Fri) 11:51
投稿者魔界の仮面弁士
> vb6で作成したexe同士での連携を考えています。
起動時に情報を一方通行的に渡すだけなら、
Shell 関数でコマンドライン引数を渡し、
それを Command 関数で受け取るのが楽でしょう。

双方向的な通信が必要なら、16bit 時代からの古いテクノロジーですが、
DDE を使うという手もあります。Form やコントロールが持つ
「Link某」というプロパティ / メソッド / イベントを調べてみてください。
http://7ujm.net/VB/VB6DDE.html


> そのときに標準出力が使えないかと考え検索したところ
そもそも、呼び出し元のコンソールが無いからですね…。

逆に言えば、呼び出し元がコンソールでさえあれば良いので、
PowerShell から『C:\TEST\Project1.exe | Write-Host』あるいは
コマンド プロンプトから『C:\TEST\Project1 | MORE』のように呼び出した場合は、
FileSystemObject の GetStamdardStream を使った最初のコードだけで、
呼び出し元のコンソールに表示されると思います。API 等も不要です。


もしも EXE を単体で起動したときに、コンソールが表示されるようにしたいなら、
そのアプリが「コンソール アプリケーション」でなければなりません。

VB6 は CUI アプリを作るためのものではないので、基本的には無理ですが、
\Microsoft Visual Studio\vb98\LINK.EXE を利用することで、
無理矢理 CUI アプリにするという裏技はあります。
hhttps://www.xaprb.com/blog/2005/10/14/how-to-create-a-vb6-console-program/

興味がある場合は、Visual Basic Magazine 誌のバックナンバーを探してきて
『Stealrideの逆襲 [Visual Basicで標準入出力を扱う]』を読んでみてください。
(手元の記録が間違っていなければ、June 1998 の記事だったはず)

とはいえ、そうまでして標準出力にこだわっても仕方がないでしょう。
正攻法で標準入出力を扱いたいのであれば、VB6 で ActiveX DLL をつくり、
呼び出し元を VBScript にすることです。CScript.exe からの
VBScript 呼び出してであれば、標準入出力を扱えます。


> そのときに標準出力が使えないかと考え検索したところ、
Private Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As OLE_HANDLE) As Long
ではなく
Private Declare Function AllocConsole Lib "kernel32" () As Long
を呼ぶようにすれば、先のコード(FileSystemObject の GetStandardStream メソッドで得た
TextStream への Write メソッド呼び出し)にてコンソール出力が可能となります。

ただし、AllocConsole API を呼び出した時点で、新たにコンソール ウィンドウが
開かれることになります。(CUI アプリとしてコンパイルされない限りは)

新たに開くのではなく、呼び出し元のコンソールがあって、そこに割り当てたい場合には、
AttachConsole API を使います。

逆に、コンソールから切り離す場合は、FreeConsole API です。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。