Registreeri liikmeks  Login  
 Foorum Minimize

OtsingFoorumi esileht
  Tooted ja tehnoloogiad  Programmeerimiskeel C#  Visual C# & cdm...
 Visual C# & cdm.exe
 
-Raitz-
1 postitust
Liitunud
21.09.2006

Visual C# & cdm.exe
Postitud: 22 sept 06 15:05 Modified By -Raitz-  on 22.09.2006 15:28:55)

Kuidas teha selline Win. application mis nupu vajutusel avaks cmd.exe ja kirjutaks minu programmis textbox-ides olevad kirjed sinna sisse. Või kas või ühe kirje.

mommi
3 postitust
mommi.msn.ee
Liitunud
11.02.2006

Re: Visual C# & cdm.exe
Postitud: 25 sept 06 6:38

Ma nüüd otse peas kirjutan, kuid cmd.exe lahti tegemiseks peaks piisama sellisest reast:

Process.Start("cmd.exe");

Vaja on muidugi koodis võtta ka kasutusele ka vastav Namespace, ehk antud juhul tuleks lisada ka selline klausel:

using System.Diagnostics;

Kuidas nüüd aga teksti sinna aknasse lisada, vot see on hea küsimus...
Hetkel jään vastuse võlgu igatahes. Võid muidugi google-st/live search-st uurida, kas cmd.exe programm toetab ka mingeid parameetreid, et näiteks kas sellist asja on võimalik kirjutada "cmd.exe - ping www.ee".
Seda võid ka proovida nii, et võtad Start->Run ja kirjutad sinna...
Teine võimalik variant oleks kasutada Win32 API-sid ja saata cmd.exe programmile mingi message läbi teatud pipeline-de. Kuidas see täpselt käib, selles polt mul õrna aimugi, aga tean et võimalik on...

reget
6 postitust
Liitunud
28.08.2006

Re: Visual C# & cdm.exe
Postitud: 25 sept 06 18:09
Tere
See ülesanne ei ole just kõige lihtsamate killast. Cmd.exe väljundi ja sisendi ümbersuunamine töötab enam -vähem siis, kui konsooliakent ennast näha ei ole. Praegu oskan pakkuda ainult sellise lahenduse, mille korral mingi käsurea programmi käsuargumendid antakse programmile läbi textbox-i kaasa ja programmi töö tulemus kuvatakse sama vormi RichTextBox'is.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
using System.Threading;


namespace WindowsApplication2
{
    public partial class Form1 : Form
    {
        public delegate void lopp();
       
        private string valjund = "";
        private string veavaljund = "";
       
        //lopp delegaadi kaudu kutsutakse välja netstat'i monitoorivast lõimest
        //lopetas() meetod, mis uuendab RichTextBox'i
        public void lopetas()
        {
            richTextBox1.Text = "--------------------väljund----------------------" + Environment.NewLine;
            richTextBox1.Text += valjund;
            richTextBox1.Text += "-------------------veaväljund--------------------" + Environment.NewLine;
            richTextBox1.Text += veavaljund;
           
         }
       
       
       
        public Form1()
        {
            InitializeComponent();
        }



        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {//kui vajutatakse <ENTER> klahvile
            if (e.KeyChar == (char)Keys.Return)
            { Thread kProg = new Thread(Alusta);
            kProg.Start();
        }

        }

        private void Alusta()
        {
            try
            {
                //uus protsess
                Process ps = new Process();
                //nimega netstat.exe
                ps.StartInfo.FileName = "netstat.exe";
                //argumendid saab tekstikastist
                ps.StartInfo.Arguments = textBox1.Text;
                //suunan ümber väljundi ja veaväljundi
                //selleks, et saada nende sisu oma vormi
                //richTextBox1 tekstikasti
                ps.StartInfo.RedirectStandardOutput = true;
                ps.StartInfo.RedirectStandardError = true;
                //keelan opsüsteemi käsukestal "vahele segada"
                ps.StartInfo.UseShellExecute = false;
                // ei taha, et protsess ilmuks nähtavale
                ps.StartInfo.CreateNoWindow = true;
                //stardin protsessi
                ps.Start();
                //moodustan viidad protsessi väljundile ja veaväljundile
                StreamReader nOut = ps.StandardOutput;
                StreamReader eOut = ps.StandardError;
                //loen väljundi ja veaväljundi eelnevalt defineeritud string muutujatesse
                valjund = nOut.ReadToEnd();
                veavaljund = eOut.ReadToEnd();
                //käivitatakse delegaatfunktsioon
                //viimane kutsutakse välja asünkroonselt
                //st. kui lõim kokku jookseb jääb kasutajavorm ikka töökõlblikuks
                BeginInvoke(new lopp(lopetas));
            }
            catch (Exception e)
            { MessageBox.Show(e.Message); }

        }
    }
}


Eelnev on WindowsApplication tüüpi projekti Form1.cs lehe sisu, kusjuures vormis eneses peavad olema: 1 TextBox nimega textBox1 ja 1 RichTextBox. textBox1 reageerib <ENTER> klahvi vajutusele (koodis private void textBox1_KeyPress) funktsioon.

Loomulikult võib eelnevale lisada RedirectStandardInput konstruktsiooni.
Muide, programmi sisendi-väljundi ümbersuunamisest võid vaadata ka abiinfo märksõna RedirectStandardInput alt.

Mitmelõimeliste programmide hingeelust võib lugeda näiteks seda artiklit:
http://msdn.microsoft.com/msdnmag/issues/03/02/Multithreading/default.aspx

Või siis artiklite kogumikku
http://www.c-sharpcorner.com/Multithreading.asp




reget
6 postitust
Liitunud
28.08.2006

Re: Visual C# & cdm.exe
Postitud: 25 sept 06 18:53
Huvi oleks C# praktikute käest teada saada, kuidas on C# realiseeritud protsesside vaheline suhtlemine. Kas pipe, mailslot, RPC või mõne muu sarnase näitena.
Melborp
7 postitust
Liitunud
25.01.2006

Re: Visual C# & cdm.exe
Postitud: 26 sept 06 16:08 Modified By Melborp  on 26.09.2006 16:10:04)

Tere,

uues .Net 2.0 -s on olemas API Windows OS IPC (inter-process communication) kasutamiseks.

http://msdn2.microsoft.com/en-US/library/system.runtime.remoting.channels.ipc.aspx

Vanal heal ajal ja ka praegu on olemas .Net Remoting, mis töötab üle võrgu protokollide ja kasutatakse Windows OS vahel andmete vahetuseks (või siis OS -i siseseks andmevahetuseks). Kiirus ei ole muidugi võrreldav IPC -ga - üks kasutab võrguprotokolle, teine suhtleb sisemiselt. Samas jälle .Net Remoting on laiemalt kasutamiseks - ka erinevate masinate vaheliseks suhtluseks (Windowsi masinad).

Mõned head näited erinevate suhtluste jaoks:

http://www.thinktecture.com/Resources/RemotingFAQ/RemotingLinks.html

Named pipede näide:
http://www.codeguru.com/Csharp/.NET/net_general/performance/article.php/c7259/#more

IPC channeli jaoks leiate mõningase näite msdn2 -st :)
http://msdn2.microsoft.com/en-us/library/system.runtime.remoting.channels.ipc.ipcchannel.aspx

Päikest,
Taavi

  Tooted ja tehnoloogiad  Programmeerimiskeel C#  Visual C# & cdm...
Foorumi esileht  Otsing       

Kõik õigused kaitstud. ENETA © 2005-2006   Terms Of Use  Privacy Statement
DotNetNuke® is copyright 2002-2007 by Perpetual Motion Interactive Systems Inc.