忍者ブログ
暇人おやじの暇なつぶやき
[3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13]
×

[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 で記載する場合がある
cincoutは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のデータを使うを利用して、ボタンクリックイベントのみで作成してみた
特に問題はないようだ


忍者ブログ [PR]
カレンダー
08 2024/09 10
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
フリーエリア
最新CM
最新TB
プロフィール
HN:
忍者 シオ才
性別:
非公開
バーコード
ブログ内検索