暇人おやじの暇なつぶやき
× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
■プロセスの起動
前回の日記「ファイル名を指定して実行」ではプロセスを作成して起動するサンプルをMSのページから 拝借した しかしこれには問題があった それはプロセスを生成し、そのプロセスから本体(フォーム上のテキストボックス)などに アクセスできないのである これを回避するためにはプロセスの実行をコンポーネントから行うと出来るようである コンポーネントを配置すると、フォーム1に帰属するため、そのコンポーネントからの 起動はフォーム1で把握しているようである おそらく、自身でprocessを作成しても同じことが可能ではあるとおもわれるが サンプルコードでは残念ながらできないのはなんともしがたい PR
■別のプロセスを起動する
タイトルはウインドウズのスタートメニューにある項目ですが、これの実装がサンプルとしてありました コードは次になります Process^ myProcess; myProcess->Start(); プロセスを使うには次の名前空間を定義します using namespace System::Diagnostics; using namespace System::ComponentModel; プロセスを起動する際、最低限必要な項目は「StartInfo->FileName」になります 次のコードはマイドキュメントのフォルダにある「MyFile.doc」を設定します // Get the path that stores user documents. String^ myDocumentsPath = Environment::GetFolderPath( Environment::SpecialFolder::Personal ); myProcess->StartInfo->FileName = String::Concat( myDocumentsPath, "\\MyFile.doc" ); 尚、MSのサンプルでは「StartInfo->Verb」が次のように設定されています myProcess->StartInfo->Verb = "Print"; これはファイルを開いて印刷を指示することになりますので、バッチなどを起動する場合には この項目は設定しません プロセスが終了した際に、正常終了したか否かを取得する場合には、イベントを定義します 次のコードはプロセスを新規作成し、イベントを発生させるためのプロパティ「EnableRaisingEvents 」を設定し、イベントを定義しています myProcess = gcnew Process; myProcess->StartInfo->CreateNoWindow = true; myProcess->EnableRaisingEvents = true; myProcess->Exited += gcnew System::EventHandler(this, &Form1::myProcess_Exited); これにより、終了時に「Exited 」イベントである「myProcess_Exited」が発生します private: System::Void myProcess_Exited(System::Object^ sender, System::EventArgs^ e) { String^ ecode = Convert::ToString(myProcess->ExitCode); MessageBox::Show(ecode,Application::ProductName,MessageBoxButtons::OKCancel,MessageBoxIcon::Asterisk); myProcess->Exited->Remove; } イベント発生時、その終了コードをメッセージボックスで確認できます
■文字型の相互変換を行う Byte配列←→String型文字列①
まずString文字列をバイト配列にするにはEncodingクラスの命令GetBytesを利用する そのためにあらかじめEncoding型の変数を定義する System::Text::Encoding^ sjis; エンコードはあらかじめ決められた方式があるが、日本語を利用するシフトJISコードなどを定義する場合には GetEncoding命令で文字コードを与えないとならない sjis= Encoding::GetEncoding( "shift_jis" ); この変数sjisを利用しByte配列へString型の文字列を変換して格納するには byte配列の準備 array<Byte>^b = gcnew array<Byte>(10); 次に、GetBytes命令でByte値を取得する b = sjis->GetBytes(sInput); 上記は10Byte分の領域を確保し、sinputの文字列を変換している 実際のコードは int main(array<System::String ^> ^args) { String^ sInput; System::Text::Encoding^ sjis= Encoding::GetEncoding( "shift_jis" ); sInput = Console::ReadLine(); array<Byte>^b = gcnew array<Byte>(sInput->Length); b = sjis->GetBytes(sInput); //sjis->GetBytes(sInput,0,sInput->Length,b,0); //array<Byte>^b = {0x00,0x12,0x34,0x56,0xAA,0x55,0xFF}; Console::WriteLine( HexTest::ToHexString( b ) ); Console::ReadLine(); return 0; } このような感じである これは25日のサンプルC++のサンプルで・・・(http://prg40age.blog.shinobi.jp/Entry/55/)を改良して、変換する文字列をコンソールから入力するようにしたものである
■サンプルを活用する
マイクロソフトの.NET Framework Developer Centerには様々なサンプルコードが記載されている しかし残念ながらそのまま動くものと動かないものがある 何故か? たいていのコードは標準的な書かれ方をしているため、またコンソールアプリとして書かれている場合が 多いのでVC++などの環境では動いても一瞬で終了するような事がある Console::WriteLine( HexTest::ToHexString( b ) ); コンソールへの出力で終わっているプログラムの場合には、その後に入力待ちを入れるなどの工夫が 必要である Console::ReadLine(); 通常C++の入力待ちは cin で記載する場合がある cinやcoutはC++ネイティブ(?)としてヘッダーiostreamに記載があるのでこれをincludeしないと使用できない そこで、上述の Console::ReadLine();を利用するのが便利である 次のコードはbyte変換用のサンプルと、それをVC++で使う際に変更したコード ■MSのサンプル ---------------------------------------------- ref class HexTest { private: static array<Char>^hexDigits = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; public: static String^ ToHexString( array<Byte>^bytes ) { array<Char>^chars = gcnew array<Char>(bytes->Length * 2); for ( int i = 0; i < bytes->Length; i++ ) { int b = bytes[ i ]; chars[ i * 2 ] = hexDigits[ b >> 4 ]; chars[ i * 2 + 1 ] = hexDigits[ b & 0xF ]; } return gcnew String( chars ); } }; int main() { array<Byte>^b = {0x00,0x12,0x34,0x56,0xAA,0x55,0xFF}; Console::WriteLine( HexTest::ToHexString( b ) ); } ------------------------------------------------------------- ■実際のコード ---------------------------------------------- // hextest.cpp : メイン プロジェクト ファイルです。 #include "stdafx.h" using namespace System; ref class HexTest { private: static array<Char>^hexDigits = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; public: static String^ ToHexString( array<Byte>^bytes ) { array<Char>^chars = gcnew array<Char>(bytes->Length * 2); for ( int i = 0; i < bytes->Length; i++ ) { int b = bytes[ i ]; chars[ i * 2 ] = hexDigits[ b >> 4 ]; chars[ i * 2 + 1 ] = hexDigits[ b & 0xF ]; } return gcnew String( chars ); } }; int main(array<System::String ^> ^args) { array<Byte>^b = {0x00,0x12,0x34,0x56,0xAA,0x55,0xFF}; Console::WriteLine( HexTest::ToHexString( b ) ); Console::ReadLine(); return 0; } -------------------------------------------------------------
■フリーのDelphi『TurboDelphi』シリーズのレジスト
TurboDelphiシリーズとなったフリーのDelphiだが、これを使うにはレジストリ登録をしないと ならない。非常に面倒だ。ここら辺がユーザーの増えない一因だと思う。 登録はcodegearのHPでアカウント登録を適当に行なう。適当と云ってもIDやらパスワードは忘れないように。 登録し製品ダウンロードの画面にて「SendActivation」を行なうとレジストメールが来る。 このメールの添付ファイルを、あるフォルダに置くことで、Delphiが起動時にファイルを読み込み 起動することができるのだ。 あるフォルダとは、メールに記載されているので確認されたし。 (ホームとなっている、マイドキュメントではないので注意!)
■接続相手のIPとポートを表示する
// Uses the RemoteEndPoint property. Console::WriteLine( "Connected to {0} on port number {1}", IPAddress::Parse( ( ( (IPEndPoint^)(socket->RemoteEndPoint) )->Address)->ToString() ), ( (IPEndPoint^)(socket->RemoteEndPoint) )->Port.ToString() ); これはマイクロソフトのサンプルから抜粋 ソケット接続後であれば閉じるまでの間、いつでも確認ができる
■RichTextBoxに改行コードを挿入してみる
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { Form2^ F2 = gcnew Form2(); F2->ShowDialog(); richTextBox1->AppendText(F2->textBox1->Text); richTextBox1->AppendText(Environment::NewLine); } 先般のForm2のデータを使うを利用して、ボタンクリックイベントのみで作成してみた 特に問題はないようだ |
カレンダー
カテゴリー
フリーエリア
最新CM
最新TB
ブログ内検索
|