タイトル : 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 です。 |