DotNet编程-星光伴我行

滴滴真谛 水滴石穿

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
//目前此方法只在WindowsXP测试通过,在Windows2003服务器上不能应用
//本文主要介绍对用c#.net生成的Windows服务程序进行安装,共采用了两种方法,其中一种方法为调用
//installutil.exe进行安装,同时生成了 Process 类 的使用实例
//writer:furenjun 2006.4.28
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;



using System.Diagnostics;
using System.Reflection;
using System.Collections.Specialized;
using System.Text;

namespace installWindowsService
{
    
/// <summary>
    
/// Form1 的摘要说明。
    
/// </summary>

    public class Form1 : System.Windows.Forms.Form
    
{
        
Private Variables Private Variables
        
DLLImport

        
private System.Windows.Forms.Button button1;
        
/// <summary>
        
/// 必需的设计器变量。
        
/// </summary>

        private System.ComponentModel.Container components = null;

        
public Form1()
        
{
            
//
            
// Windows 窗体设计器支持所必需的
            
//
            InitializeComponent();

            
//
            
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
            
//
        }


        
/// <summary>
        
/// 清理所有正在使用的资源。
        
/// </summary>

        protected override void Dispose( bool disposing )
        
{
            
if( disposing )
            
{
                
if (components != null
                
{
                    components.Dispose();
                }

            }

            
base.Dispose( disposing );
        }


        
Windows 窗体设计器生成的代码

        
/// <summary>
        
/// 应用程序的主入口点。
        
/// </summary>

        [STAThread]
        
static void Main() 
        
{
            Application.Run(
new Form1());
        }


        
private void button1_Click(object sender, System.EventArgs e)
        
{
            

            
string svcPath;
            
string svcName;
            
string svcDispName;
            
//服务程序的路径
            svcPath = @"E:\TransactionServiceCS\bin\Release\TransactionServiceCS.exe";
        
            
//OpenFileDialog openFileDialog1 = new OpenFileDialog();

            openFileDialog1.InitialDirectory 
= "c:\\" ;
            openFileDialog1.Filter 
= "exe file(*.exe)|*.*" ;
            openFileDialog1.FilterIndex 
= 0 ;
            openFileDialog1.RestoreDirectory 
= true ;



            
if(openFileDialog1.ShowDialog() != DialogResult.OK)
            
{
            
                
return;
            }

            
else
                svcPath
=this.openFileDialog1.FileName;  
            svcDispName
="MyDBWriter";
            svcName
= "MyDBWriter";
            
            
if(InstallService(svcPath, svcName, svcDispName))
                MessageBox.Show(
"安装成功") ;
            Console.Read();

        }

        
/// <summary>
        
/// 安装和运行
        
/// </summary>
        
/// <param name="svcPath">程序路径.</param>
        
/// <param name="svcName">服务名</param>
        
/// <param name="svcDispName">服务显示名称.</param>
        
/// <returns>服务安装是否成功.</returns>

        public bool InstallService(string svcPath, string svcName, string svcDispName)
        
{
            
Constants declaration. Constants declaration.
            
try
            
{
                IntPtr sc_handle 
= OpenSCManager(null,null,SC_MANAGER_CREATE_SERVICE);
                
if (sc_handle.ToInt32() != 0)
                
{
                    IntPtr sv_handle 
= CreateService(sc_handle,svcName,svcDispName,SERVICE_ALL_ACCESS,SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START,SERVICE_ERROR_NORMAL,svcPath,null,0,null,null,null);
                    
if(sv_handle.ToInt32() ==0)
                    
{
                        CloseServiceHandle(sc_handle);
                        
return false;
                    }

                    
else
                    
{
                        
//试尝启动服务
                        int i = StartService(sv_handle,0,null);
                        
if(i==0)
                        
{

                            
return false;
                        }


                        CloseServiceHandle(sc_handle);
                        
return true;
                    }

                }

                
else

                    
return false;
            }

            
catch(Exception e)
            
{
                
throw e;
                
            }

            
        }

        
/// <summary>
        
/// 反安装服务.
        
/// </summary>
        
/// <param name="svcName">服务名.</param>

        public bool UnInstallService(string svcName)
        
{
            
int GENERIC_WRITE = 0x40000000;
            IntPtr sc_hndl 
= OpenSCManager(null,null,GENERIC_WRITE);
            
if(sc_hndl.ToInt32() !=0)
            
{
                
int DELETE = 0x10000;
                IntPtr svc_hndl 
= OpenService(sc_hndl,svcName,DELETE);
                
if(svc_hndl.ToInt32() !=0)
                

                    
int i = DeleteService(svc_hndl);
                    
if (i != 0)
                    
{
                        CloseServiceHandle(sc_hndl);
                        
return true;
                    }

                    
else
                    
{
                        CloseServiceHandle(sc_hndl);
                        
return false;
                    }

                }

                
else
                    
return false;
            }

            
else
                
return false;
        }


        
private void button2_Click(object sender, System.EventArgs e)
        
{

            
// Get the path to InstallUtil
            string installUtilPath = RuntimeEnvironment.GetRuntimeDirectory() + "InstallUtil.exe";
            
string svsPath = @"E:\TransactionServiceCS\bin\Release\TransactionServiceCS.exe";
            
if(openFileDialog1.ShowDialog() != DialogResult.OK)
            
{
                            
                
return;
            }

            
else
                svsPath
=@" "+this.openFileDialog1.FileName; 
            MessageBox.Show(svsPath) ;
            
this.button2.Enabled =false
            RunInstallUtil(installUtilPath,svsPath );
        }

    
        
public  void RunInstallUtil(string installUtilPath, string CmdParameterAndfullExeName) 
        
{
            
            
string argument = CmdParameterAndfullExeName;

            
// Create a new process
            Process process = new Process();

            
// Setup the new process's information
            ProcessStartInfo processStartInfo = new ProcessStartInfo();
            
// Set the path of the file to be executed by the new process
            processStartInfo.FileName = installUtilPath;
            
// Set the arguments of the new process
            processStartInfo.Arguments = argument;
            
// Stop it from using the shell to start the new process
            
//(this is necessary in order to stop it from creating a new window)
            processStartInfo.UseShellExecute = false;
            
// Don't let it create a new window
            
//processStartInfo.CreateNoWindow = true;
            processStartInfo.CreateNoWindow = false//显示窗体


            
//注意   如果将 ErrorDialog 设置为 true,则 UseShellExecute 必须为 true。
            
//WorkingDirectory 属性的行为在 UseShellExecute 分别为 true 和 false 时是不同的。
            
//当 UseShellExecute 为 true 时,WorkingDirectory 属性指定可执行文件的位置。
            
//如果 WorkingDirectory 是空字符串,则认为当前目录包含可执行文件。
            
//当 UseShellExecute 为 false 时,不使用 WorkingDirectory 属性查找可执行文件。
            
//相反,它被已启动的进程使用,并且只在新进程的上下文中有意义。
        
            
// Assign the information to the process
            process.StartInfo = processStartInfo;

            
// Start the process and wait for it to exit
            process.Start();

            process.WaitForExit();
            
            button2.Enabled 
=true

            

        }


        
private void button3_Click(object sender, System.EventArgs e)
        
{
            
string installUtilPath = RuntimeEnvironment.GetRuntimeDirectory() + "InstallUtil.exe";
            
string svsPath = @"E:\TransactionServiceCS\bin\Release\TransactionServiceCS.exe";
            
if(openFileDialog1.ShowDialog() != DialogResult.OK)
            
{
                            
                
return;
            }

            
else
                svsPath
=@" /u "+this.openFileDialog1.FileName; 
            MessageBox.Show(svsPath) ;
            
this.button2.Enabled =false
            RunInstallUtil(installUtilPath,svsPath );
        }


        
private void button4_Click(object sender, System.EventArgs e)
        
{
            
// Start a new process for the cmd
            
//string FileName=@"..\..\printNum.exe";
            this.richTextBox1.Text ="开始打印:"+System.DateTime.Now.ToString()+"\n";  
            
string FileName=Application.StartupPath +@"\printNum.exe";
            Process process 
= new Process();
            process.StartInfo.UseShellExecute 
= false;
            process.StartInfo.RedirectStandardOutput 
= true;
            process.StartInfo.RedirectStandardError 
= true;
            process.StartInfo.CreateNoWindow 
= true;
            process.StartInfo.FileName 
= FileName;
            process.StartInfo.Arguments 
="";
            process.StartInfo.WorkingDirectory 
= Application.StartupPath ; //获取或设置要启动的进程的初始目录。
            try
            
{
                process.Start();
                
string outputStr=process.StandardOutput.ReadToEnd();
                
this.richTextBox1.AppendText(outputStr + Environment.NewLine);
            }

            
catch(System.Exception e1)
            
{
                
this.richTextBox1.AppendText(e1.ToString()  + Environment.NewLine);
                
string ErrorOutput=process.StandardError.ToString();  
                
this.richTextBox1.AppendText(ErrorOutput + Environment.NewLine);
                
if(process.HasExited)
                    process.Kill();
            }

        }

    }

}

using System;
using System.Threading;
namespace printNum
{
    
/// <summary>
    
/// Class1 的摘要说明。
    
/// </summary>

    class Class1
    
{
        
/// <summary>
        
/// 应用程序的主入口点。
        
/// </summary>

        [STAThread]
        
static void Main(string[] args)
        
{
            
//
            
// TODO: 在此处添加代码以启动应用程序
            
//
            for (int lineNumber = 0; lineNumber < 50; lineNumber++)
            
{
                Console.WriteLine (
"正在打印: " + lineNumber);
                System.Threading.Thread.Sleep(
2); // immitate doing something between Console Writes.
            }

            Console.WriteLine (
"打印结束!");
        }

    }

}

posted on 2006-04-28 15:58  DotNet编程  阅读(1013)  评论(0编辑  收藏  举报