//目前此方法只在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();
}
}
}
}
//本文主要介绍对用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 ("打印结束!");
}
}
}
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 ("打印结束!");
}
}
}