zoukankan
html css js c++ java
在客户机上安装Windows服务
//
目前此方法只在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
#region
Private Variables
private
string
_servicePath;
private
string
_serviceName;
private
System.Windows.Forms.OpenFileDialog openFileDialog1;
private
System.Windows.Forms.Button button2;
private
System.Windows.Forms.Button button3;
private
System.Windows.Forms.RichTextBox richTextBox1;
private
System.Windows.Forms.Button button4;
private
string
_serviceDisplayName;
#endregion
Private Variables
DLLImport
#region
DLLImport
[DllImport(
"
advapi32.dll
"
)]
public
static
extern
IntPtr OpenSCManager(
string
lpMachineName,
string
lpSCDB,
int
scParameter);
[DllImport(
"
Advapi32.dll
"
)]
public
static
extern
IntPtr CreateService(IntPtr SC_HANDLE,
string
lpSvcName,
string
lpDisplayName,
int
dwDesiredAccess,
int
dwServiceType,
int
dwStartType,
int
dwErrorControl,
string
lpPathName,
string
lpLoadOrderGroup,
int
lpdwTagId,
string
lpDependencies,
string
lpServiceStartName,
string
lpPassword);
[DllImport(
"
advapi32.dll
"
)]
public
static
extern
void
CloseServiceHandle(IntPtr SCHANDLE);
[DllImport(
"
advapi32.dll
"
)]
public
static
extern
int
StartService(IntPtr SVHANDLE,
int
dwNumServiceArgs,
string
lpServiceArgVectors);
[DllImport(
"
advapi32.dll
"
,SetLastError
=
true
)]
public
static
extern
IntPtr OpenService(IntPtr SCHANDLE,
string
lpSvcName,
int
dwNumServiceArgs);
[DllImport(
"
advapi32.dll
"
)]
public
static
extern
int
DeleteService(IntPtr SVHANDLE);
[DllImport(
"
kernel32.dll
"
)]
public
static
extern
int
GetLastError();
#endregion
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 窗体设计器生成的代码
#region
Windows 窗体设计器生成的代码
/**/
///
<summary>
///
设计器支持所需的方法 - 不要使用代码编辑器修改
///
此方法的内容。
///
</summary>
private
void
InitializeComponent()
{
this
.button1
=
new
System.Windows.Forms.Button();
this
.openFileDialog1
=
new
System.Windows.Forms.OpenFileDialog();
this
.button2
=
new
System.Windows.Forms.Button();
this
.button3
=
new
System.Windows.Forms.Button();
this
.richTextBox1
=
new
System.Windows.Forms.RichTextBox();
this
.button4
=
new
System.Windows.Forms.Button();
this
.SuspendLayout();
//
//
button1
//
this
.button1.Location
=
new
System.Drawing.Point(
320
,
24
);
this
.button1.Name
=
"
button1
"
;
this
.button1.Size
=
new
System.Drawing.Size(
248
,
56
);
this
.button1.TabIndex
=
0
;
this
.button1.Text
=
"
第一种方法:安装Windows服务
"
;
this
.button1.Click
+=
new
System.EventHandler(
this
.button1_Click);
//
//
button2
//
this
.button2.Location
=
new
System.Drawing.Point(
320
,
88
);
this
.button2.Name
=
"
button2
"
;
this
.button2.Size
=
new
System.Drawing.Size(
248
,
56
);
this
.button2.TabIndex
=
0
;
this
.button2.Text
=
"
第二种方法:安装Windows服务
"
;
this
.button2.Click
+=
new
System.EventHandler(
this
.button2_Click);
//
//
button3
//
this
.button3.Location
=
new
System.Drawing.Point(
320
,
160
);
this
.button3.Name
=
"
button3
"
;
this
.button3.Size
=
new
System.Drawing.Size(
248
,
56
);
this
.button3.TabIndex
=
0
;
this
.button3.Text
=
"
第二种方法:unInstallWindows服务
"
;
this
.button3.Click
+=
new
System.EventHandler(
this
.button3_Click);
//
//
richTextBox1
//
this
.richTextBox1.Location
=
new
System.Drawing.Point(
24
,
32
);
this
.richTextBox1.Name
=
"
richTextBox1
"
;
this
.richTextBox1.Size
=
new
System.Drawing.Size(
208
,
232
);
this
.richTextBox1.TabIndex
=
1
;
this
.richTextBox1.Text
=
"
richTextBox1
"
;
//
//
button4
//
this
.button4.Location
=
new
System.Drawing.Point(
328
,
240
);
this
.button4.Name
=
"
button4
"
;
this
.button4.Size
=
new
System.Drawing.Size(
176
,
23
);
this
.button4.TabIndex
=
2
;
this
.button4.Text
=
"
执行进程
"
;
this
.button4.Click
+=
new
System.EventHandler(
this
.button4_Click);
//
//
Form1
//
this
.AutoScaleBaseSize
=
new
System.Drawing.Size(
6
,
14
);
this
.ClientSize
=
new
System.Drawing.Size(
584
,
310
);
this
.Controls.Add(
this
.button4);
this
.Controls.Add(
this
.richTextBox1);
this
.Controls.Add(
this
.button1);
this
.Controls.Add(
this
.button2);
this
.Controls.Add(
this
.button3);
this
.Name
=
"
Form1
"
;
this
.Text
=
"
Form1
"
;
this
.ResumeLayout(
false
);
}
#endregion
/**/
///
<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.
#region
Constants declaration.
int
SC_MANAGER_CREATE_SERVICE
=
0x0002
;
int
SERVICE_WIN32_OWN_PROCESS
=
0x00000010
;
//
int SERVICE_DEMAND_START = 0x00000003;
int
SERVICE_ERROR_NORMAL
=
0x00000001
;
int
STANDARD_RIGHTS_REQUIRED
=
0xF0000
;
int
SERVICE_QUERY_CONFIG
=
0x0001
;
int
SERVICE_CHANGE_CONFIG
=
0x0002
;
int
SERVICE_QUERY_STATUS
=
0x0004
;
int
SERVICE_ENUMERATE_DEPENDENTS
=
0x0008
;
int
SERVICE_START
=
0x0010
;
int
SERVICE_STOP
=
0x0020
;
int
SERVICE_PAUSE_CONTINUE
=
0x0040
;
int
SERVICE_INTERROGATE
=
0x0080
;
int
SERVICE_USER_DEFINED_CONTROL
=
0x0100
;
int
SERVICE_ALL_ACCESS
=
(STANDARD_RIGHTS_REQUIRED
|
SERVICE_QUERY_CONFIG
|
SERVICE_CHANGE_CONFIG
|
SERVICE_QUERY_STATUS
|
SERVICE_ENUMERATE_DEPENDENTS
|
SERVICE_START
|
SERVICE_STOP
|
SERVICE_PAUSE_CONTINUE
|
SERVICE_INTERROGATE
|
SERVICE_USER_DEFINED_CONTROL);
int
SERVICE_AUTO_START
=
0x00000002
;
#endregion
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 (
"
打印结束!
"
);
}
}
}
查看全文
相关阅读:
pandas之中文分词,词云,情感分析,语义分析3
pandas之中文分词,词云,情感分析,语义分析2
pandas之中文分词,词云,情感分析,语义分析1
大数据学习之-the king of bigdata
pandas之分组聚合(agg,apply)
pandas之表的长宽转换
Pandas数据规整之合并
Pandas之数据规整
Pandas数据规整
IP协议那些事
原文地址:https://www.cnblogs.com/furenjun/p/387602.html
最新文章
C++ vector基本用法
QT快捷键
malloc 和free例程
memset
(QT)在命令行编译ui文件和程序
'mingw32-make' 不是内部或外部命令,也不是可运行的程序 或批处理文件。(的解决方案)
动态一维、二维输入数组变量
精度
冒泡排序法
g++
热门文章
ECharts特效-折线图上一个光点来回移动
Markdown特殊字符、数学公式汇总
yml文件中${DB_HOST:localhost}的含义
常用的跨域问题解决方式
打包遇到错误Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.2:test
使用Spring的RestTemplate进行接口调用
Java-IO
Spring Cloud Alibaba学习笔记
IE浏览器兼容问题总结
pandas之中文分词,词云,情感分析,语义分析4
Copyright © 2011-2022 走看看