コンソールが出せた!完璧だ!言うことなし

アプリケーションのプロパティでマルチスタートアップという指定ができる.これを使えばC++アプリとC#アプリを並列実行できそうだ.⇒ただし,C++の出力をDLLからEXEに切り替えるとまた,いろいろな不都合が噴出してくる.もし,これをやろうとするのなら EXE 生成用のプロジェクトを別途作って,それ以外の部分をDLL化するしかない.⇒さすがに,そこまでやるとなると右から左という訳にはゆかなくなってくる.ただし,そうすることのメリットもある.処理を切り分けてライブラリ化するというのはいずれやらなくてはならない仕事のうちだ.⇒とりあえず,ここのところはパスして先を急ぐことにしよう.

C++アプリを単独で起動することはできる.このコンストラクタからC#のフォームを開くことはできないだろうか?⇒かなり難しいと思う.エラーが発生するのは仕方ないので,エラーが発生してもアプリをアボートしないようにエラー処理に手を入れておくことにする.⇒現行バージョンのVSは型検査が厳密になっていて,const char* を char* と混同することができないようになっている.文字列をスローしている場合があるので,それを受けるときは const char* で取る必要がある.とりあえず,大体動作するようになった.

コンソールとフォームを同時に開くことができるようになった.コンソールプロジェクトを立てて,マルチスタートアップを仕掛けたというだけのことだが,この2つのウィンドウが同時に操作できたら,確かにかなりおもしろいと思うのだが… printfを実行しただけではコンソールには何もでない.やはり,このウィンドウのハンドルか何かを取得してそれを使って操作しないと何もできないような感じだ.⇒コンソールハンドルを取得することは可能なようだ.⇒しかし,ウィンドウハンドルをもらってもどうすることもできない.多分ウィンドウのデバイスコンテキストまでは取得できるとは思われるが,そのあとは細かい描画処理になってしまう.⇒std:coutを取り出して再利用できるようになった.

std::ostream &conout = std::cout;
conout << “Native::ElsieCommand #####################”;

これをグローバル変数に入れてやれば,多分マルチスレッドで使い回しできるはずだ.⇒かなり,難しいが,参照して出力できるようになった.⇒いや,やっぱり後が続かない.std:coutは使い回しできないような作りになっているようだ.あきらめるしかなさそうだ.以前やったように,テキストボックスに表示するというのが可能最大限ではないだろうか?ただし,テキストボックスにはC#からしか書き込みできない.コンソールアプリはイベントループを持っていないというのが致命的だ.

こんなのがあった.【ワレコC#講座】Windows FormアプリケーションでConsoleウインドウに文字を出力する https://www.wareko.jp/blog/output-text-string-to-console-window-with-windows-form-application-in-c-sharp

これで行けるんじゃないだろうか?

まずい.どこか壊してしまったようだ.ソリューションを開いたときにエラーが発生するようになってしまった.

image

WrapperClass.csというファイルは作っていないのではないかと思うのだが… クリーンビルドして再起動でなんとか収まった.

【ワレコC#講座】ではコンソールを使う2つの方法を紹介しているが,最初の方法はうまくゆかなかった.コンソールは開けたが,書き込みもクリアもできない.書き込みはデバッグコンソールに出力されてしまうだけでなく,Console.Clearで例外が発生してしまう.2番目の方法では成功した.C#プロジェクトのプロパティで出力の種類をWindowsアプリケーションからコンソールアプリケーションに切り替えるだけだが,この状態で実行するとWindowsフォームが通常通り開き,同時にコンソールも使えるようになる.Console.Writelineで問題なく出力できた.

コンソール出力は主にDLL側でやっているので,あまり使い道はないかもしれないが,この設計は悪くないと思う.Console.Clearもその通り実行できた.いや,これはかなりよいかもしれない.Console.WriteLineだけでなく,ラッパクラスのprintfも動作している.つまり,コンソールに出力されている.これこそ望んだところだ.Debug.WriteLineをすべてConsole.WriteLineに切り替えることができるだろうか?それができるとほとんどELSIEと準同型検定が一体化したというのに等しい.

!いや,見事に出てくれた!

image

完璧だ!言うことなし.このウィンドウをフォームに嵌め込めたらさらによいのだが,そこまで求めるのはやや過大な要求というべきだろう.これでこれまでの作業が全部そのまま活きてくることになる.かなりおもしろくなってきた!いや,さすがにそう簡単には動いてくれないかも知れない.ELSIEコマンドを受け付けるところまではゆくが,データファイル名の入力に失敗した後の動作が悪い.完全な動作するところまで仕込むことができるだろうか?かなり難しそうな気はする.

使い方の要領というのもありそうだが… コントロールがどこにあるのか分からなくなってしまうところが欠点だ.カーソルを置いても何も入力できなくなるというのは,フォーカスを失っているという意味だろう.どうも,使いこなすのはかなり難しそうだ.入力を受け付けるというのを止めて読み取り専用とすればおそらく問題はなくなるはずだが…ともかく,ELSIEと準同型の統合という作業を進めるしかないだろう.

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA