Genesis2000用c#开发外挂

先上官方的说明

gateway is a command line utility for sending messages and commands to Genesis processes. The gateway command works between all systems that are connected to the same gnd server (in a client-server mode).

This command allows you send messages or run commands or scripts on any genesis process currently running without having to interfere with the GUI on that station.

 

Running gateway does not require any additional licenses. The program itself is located in $GENESIS_DIR/exx/misc  where xx is the version number (eg. e72)

 

gateway may be called in one of the following modes:

 

gateway <address> <message>

Sends a message to an address

gateway ’WHO <address>’

Returns matching address

gateway ’PID <address>’

Returns process IDs of matching adress

gateway <address>

Opens an interactive session

 

  • <address> is formed as <user>@<computer>.<display name>, where <user> is the Genesis login name, <computer> is the name of the computer, and <display> is the name of the X Display that is displaying the “get” process.

 

  • As from v7.1, <address> can also be formed as <pid>@computer.display, where <pid> is the process id of the get process, <computer> is the name of the computer, and <display> is the name of the X Display that is displaying the “get” process. This can be important if there are two get’s running on the same computer/display

 

 

  • A star symbol (“*”) may be used for globbing any part of an address.

 

  • <message> may be any of the following:

 

WHO <address>

This message returns a space separated list of all addresses matching the <address>

 

PID <address>

This message returns a space separated list of the Process IDs of all addresses matching the <address>.

 

COM <genesis line mode command>

This message send a Genesis line mode command to all Genesis processes matching the specified address, unless the operator has specified, “DON’T accept messages” in the clipboard. This message returns zero if the command completed properly. Otherwise it returns a status code.

 

 

MSG <message text>

This will cause all Genesis processes matching the specified address to receive a message and display it to the operator, unless the operator has specified “DON’T accept messages” in the clipboard.

 

ERR <error code>

This returns the display string of the error code.

 

   COMANS

              This returns the COMANS of the last COM command

 

When working in an interactive session, any of the above messages may be sent.

 

A period .” on a line by itself causes the gateway to exit. When you wish to close the session, the command must be used, since even if gateway has finished reading its standard input, it continues polling for more

messages.

Examples

 

# Print a list of all Genesis users

% gateway ’WHO *’

# Print a list of all the instances that “ben” is logged in on Genesis

% gateway ’WHO ben@*’

# Print the process IDs of all the instances of “ben” logged in on jupiter.

% gateway ’PID ben@jupiter.jupiter’

# Open a job on a specific Genesis process.

% gateway ben@jupiter.jupiter ’COM open_job,job=1745’

# An interactive session

% gateway ben@jupiter.jupiter

COM open_job,job=1745

COM script_run,name=/my_scripts/run_analysis,params=pcb

.

 

 

Note   “get” may be run with the “-x” option and without a script. This puts Genesis into a mode where it will respond to gateway COM messages but will operate without a user interface.

 

Note     This feature first appeared in Genesis Version 6.0c.

 

In Genesis v7.1, Gateway recognizes addresses of the following form:

 

% gateway <pid>@computer.display

 

To open a session with a get process with pid 17777 use:

 

% gateway %17777@pluto.pluto

 

(The % notation was chosen since a username could also be numeric.)

 

Also, in Genesis v7.1, the new command COMANS has been added. This command returns the COMANS of the last COM command. Here is a sample session:

 

% gateway ben@pluto.pluto

COM open_job,job=0.01745

0

COM open_entity,job=0.01745,type=step,name=pcb

0

COM filter_area_start

0

COM filter_area_xy,x=1,y=1

0

COM filter_area_xy,x=0,y=0

0

COM filter_area_end

0

COMANS

7

 好吧这么多英文我看着也头疼,总之外挂需要用到gateway程序,c#程序就是通过process类进行输入和输出,如下代码

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication4
{
   public class Genesis
    {
        //gateway的运行命令色这个样子的 gateway <address> <message>
        //address为genesis上的数据: 用户名@机器名.机器名
        //这里我只取第一个用户名为脚本执行的地方
        /// <summary>
        /// 程序运行的对应用户地址
        /// </summary>
        private string address { get; set; }

        /// <summary>
        ///从系统环境变量获取GENESIS的根目录
        /// </summary>
        string GENESIS_DIR { get { return Environment.GetEnvironmentVariable("GENESIS_DIR");} }
        /// <summary>
        ///从系统环境变量获取GENESIS的程序目录
        /// </summary>
        string GENESIS_EDIR { get { return Environment.GetEnvironmentVariable("GENESIS_EDIR"); } }

       /// <summary>
       /// 发送指令给genesis
       /// </summary>
       /// <param name="cmdText"></param>
       /// <returns></returns>
       public Genesis()
       {
            //返回结果以的用户以\r\n隔开要替换掉为,再分组
           string s = SendCommand("\"WHO\"");
            string[] users = s.Trim().Replace(' ',',').Split(',');
           if (users.Count()>0)
           {
               address = users[users.Count()-1];
           }
       }
       private string SendCommand(string cmdText)
       {
            Process p=new Process();
            p.StartInfo.FileName = GENESIS_EDIR + @"\misc\gateway.exe";
            //返回错误提示
            p.StartInfo.RedirectStandardError = true;
            //可以发送指令
            p.StartInfo.RedirectStandardInput = true;
            //可以用接受指令执行结果
            p.StartInfo.RedirectStandardOutput = true;
            //执行命令不显示窗口
            p.StartInfo.CreateNoWindow = true;
            ///执行指令
            p.StartInfo.Arguments = cmdText;
           p.StartInfo.UseShellExecute = false;
            //
            p.Start();
            //接收指令执行结果
            StreamReader read = p.StandardOutput;
           string s = read.ReadLine();
            //结束进程
            p.Close();
            return s;
       }

       public string COM(string cmdText)
       {
           return SendCommand(string.Format(address+ " \"COM  {0}\"",cmdText));
       }
    }
}

  核心的代码就是sendcommand函数,由于genesis有多个特殊指令,这里我只写了COM指令;还有获取用户地址的时候打开系统的任务管理器看一下是否有多个gnd或gateway运行,如果存在多个gnd程序就会崩溃,gateway最好只留一个

接着队代码进行进行测试,新建一个winform程序,添加两个 richTextBox一个用来输入指令,一个接收返回值

发送指令事件代码

 private void button1_Click(object sender, EventArgs e)
        {

            Genesis gen=new Genesis();
            //richTextBox2.AppendText(gen.COM("clipb_open_job,job=test,update_clipboard=view_job"));
            richTextBox2.AppendText(gen.COM(  richTextBox1.Text));
        }

  编译好程序打开genesis队程序进行测试,发送指令前如图:

发送指令后

程序测试完成并能接收到结果0;

posted @ 2016-01-10 20:59  悳鎭  阅读(2958)  评论(0编辑  收藏  举报