Install Windows Service with Interacted with Desktop

第 9 步(可选):设计器与智能标记 (约 90 行)依赖:第 6 步()、程序集完成后:设计器里选中按钮,右上角出现“智能标记”,可直接改文字与图文位置。 阅读详情


	Private Sub ProjectInstaller_AfterInstall(ByVal sender As Object, ByVal e As System.Configuration.Install.InstallEventArgs) Handles MyBase.AfterInstall

		'Our code goes in this event because it is the only one that will do

		'a proper job of letting the user know that an error has occurred,

		'if one indeed occurs. Installation will be rolled back if an error occurs.



		Dim iSCManagerHandle As Integer

		Dim iSCManagerLockHandle As Integer

		Dim iServiceHandle As Integer

		Dim bChangeServiceConfig As Boolean

		Dim bChangeServiceConfig2 As Boolean

		Dim ServiceDescription As modAPI.SERVICE_DESCRIPTION

		Dim ServiceFailureActions As modAPI.SERVICE_FAILURE_ACTIONS

		Dim ScActions(2) As modAPI.SC_ACTION	 'There should be one element for each

		'action. The Services snap-in shows 3 possible actions.



		Dim bCloseService As Boolean

		Dim bUnlockSCManager As Boolean

		Dim bCloseSCManager As Boolean



		Dim iScActionsPointer As New IntPtr



		Try

			'Obtain a handle to the Service Control Manager, with appropriate rights.

			'This handle is used to open the relevant service.

			iSCManagerHandle = modAPI.OpenSCManager(vbNullString, vbNullString, _

			modAPI.ServiceControlManagerType.SC_MANAGER_ALL_ACCESS)



			'Check that it's open. If not throw an exception.

			If iSCManagerHandle < 1 Then

				Throw New Exception("Unable to open the Services Manager.")

			End If



			'Lock the Service Control Manager database.

			iSCManagerLockHandle = modAPI.LockServiceDatabase(iSCManagerHandle)



			'Check that it's locked. If not throw an exception.

			If iSCManagerLockHandle < 1 Then

				Throw New Exception("Unable to lock the Services Manager.")

			End If



			'Obtain a handle to the relevant service, with appropriate rights.

			'This handle is sent along to change the settings. The second parameter

			'should contain the name you assign to the service.

			iServiceHandle = modAPI.OpenService(iSCManagerHandle, "ServiceTest", _

			modAPI.ACCESS_TYPE.SERVICE_ALL_ACCESS)



			'Check that it's open. If not throw an exception.

			If iServiceHandle < 1 Then

				Throw New Exception("Unable to open the Service for modification.")

			End If



			'Call ChangeServiceConfig to update the ServiceType to SERVICE_INTERACTIVE_PROCESS.

			'Very important is that you do not leave out or change the other relevant

			'ServiceType settings. The call will return False if you do.

			'Also, only services that use the LocalSystem account can be set to

			'SERVICE_INTERACTIVE_PROCESS.

			bChangeServiceConfig = modAPI.ChangeServiceConfig(iServiceHandle, _

			modAPI.ServiceType.SERVICE_WIN32_OWN_PROCESS + modAPI.ServiceType.SERVICE_INTERACTIVE_PROCESS, _

			SERVICE_NO_CHANGE, SERVICE_NO_CHANGE, vbNullString, vbNullString, _

			vbNullString, vbNullString, vbNullString, vbNullString, vbNullString)



			'If the call is unsuccessful, throw an exception.

			If Not bChangeServiceConfig Then

				Throw New Exception("Unable to change the Service settings.")

			End If



			'To change the description, create an instance of the SERVICE_DESCRIPTION

			'structure and set the lpDescription member to your desired description.

			ServiceDescription.lpDescription = "This is my custom description for my Windows Service Application!"



			'Call ChangeServiceConfig2 with SERVICE_CONFIG_DESCRIPTION in the second

			'parameter and the SERVICE_DESCRIPTION instance in the third parameter

			'to update the description.

			bChangeServiceConfig2 = modAPI.ChangeServiceConfig2(iServiceHandle, _

			modAPI.InfoLevel.SERVICE_CONFIG_DESCRIPTION, ServiceDescription)



			'If the update of the description is unsuccessful it is up to you to

			'throw an exception or not. The fact that the description did not update

			'should not impact the functionality of your service.

			If Not bChangeServiceConfig2 Then

				Throw New Exception("Unable to set the Service description.")

			End If



			'To change the Service Failure Actions, create an instance of the

			'SERVICE_FAILURE_ACTIONS structure and set the members to your

			'desired values. See MSDN for detailed descriptions.

			ServiceFailureActions.dwResetPeriod = 600

			ServiceFailureActions.lpRebootMsg = "Service failed to start! Rebooting..."

			ServiceFailureActions.lpCommand = "SomeCommand.exe Param1 Param2"

			ServiceFailureActions.cActions = ScActions.Length



			'The lpsaActions member of SERVICE_FAILURE_ACTIONS is a pointer to an

			'array of SC_ACTION structures. This complicates matters a little,

			'and although it took me a week to figure it out, the solution

			'is quite simple.



			'First order of business is to populate our array of SC_ACTION structures

			'with appropriate values.

			ScActions(0).Delay = 20000

			ScActions(0).SCActionType = modAPI.SC_ACTION_TYPE.SC_ACTION_RESTART

			ScActions(1).Delay = 20000

			ScActions(1).SCActionType = modAPI.SC_ACTION_TYPE.SC_ACTION_RUN_COMMAND

			ScActions(2).Delay = 20000

			ScActions(2).SCActionType = modAPI.SC_ACTION_TYPE.SC_ACTION_REBOOT



			'Once that's done, we need to obtain a pointer to a memory location

			'that we can assign to lpsaActions in SERVICE_FAILURE_ACTIONS.

			'We use 'Marshal.SizeOf(New modAPI.SC_ACTION) * 3' because we pass 

			'3 actions to our service. If you have less actions change the * 3 accordingly.

			iScActionsPointer = Marshal.AllocHGlobal(Marshal.SizeOf(New modAPI.SC_ACTION) * 3)



			'Once we have obtained the pointer for the memory location we need to

			'fill the memory with our structure. We use the CopyMemory API function

			'for this. Please have a look at it's declaration in modAPI.

			modAPI.CopyMemory(iScActionsPointer, ScActions, Marshal.SizeOf(New modAPI.SC_ACTION) * 3)



			'We set the lpsaActions member of SERVICE_FAILURE_ACTIONS to the integer

			'value of our pointer.

			ServiceFailureActions.lpsaActions = iScActionsPointer.ToInt32



			'We call bChangeServiceConfig2 with the relevant parameters.

			bChangeServiceConfig2 = modAPI.ChangeServiceConfig2(iServiceHandle, _

			modAPI.InfoLevel.SERVICE_CONFIG_FAILURE_ACTIONS, ServiceFailureActions)



			'If the update of the failure actions are unsuccessful it is up to you to

			'throw an exception or not. The fact that the failure actions did not update

			'should not impact the functionality of your service.

			If Not bChangeServiceConfig2 Then

				Throw New Exception("Unable to set the Service failure actions.")

			End If

		Catch ex As Exception

			Throw ex

		Finally

			'Once you are done you should close/release the handles to the service

			'and the Service Control Manager, as well as free the memory that held

			'the array of SC_ACTION structures.



			Marshal.FreeHGlobal(iScActionsPointer)

			If iServiceHandle > 0 Then

				bCloseService = modAPI.CloseServiceHandle(iServiceHandle)

			End If



			bUnlockSCManager = modAPI.UnlockServiceDatabase(iSCManagerLockHandle)



			If iSCManagerHandle > 0 Then

				bCloseSCManager = modAPI.CloseServiceHandle(iSCManagerHandle)

			End If

		End Try



		'When installation is done go check out your handy work using Computer Management!

	End Sub



 
【回眸】Tessy集成测试软件使用指南(一)新手使用篇 这个专栏的文章前4篇都在记录如何使用Tessy进行单元测试,集成测试需要有一定单元测试基础,且做集成测试之前,需要做好单元测试,否则将会大幅增加软件单元代码纠错的代价。集成测试所花费的时间通常远远超过单元测试。如果直接从单元测试到系统测试,结果往往是不理想的。集成测试可以检测由于单元相互交互而导致的错误,通常由一组专业的测试人员执行。 阅读详情

相关推荐

2022-2028年中国美容仪行业发展战略规划及投资机会预测报告

报告类型:产业研究 报告格式:电子版、纸介版 出品单位:智研咨询-产业信息网 美容仪是一种根据人体生理机能进行调节改善身体和面部的机器,它按照功能来说有美白、嫩肤、祛斑、祛皱、脱毛、减肥等多种,按照名称来说有超声波导入、光子嫩肤、高周波电疗、RF 电波拉皮、电子祛斑点痣、E 光永久脱毛嫩肤、贾法尼营养导入导出等。 智研咨询发布的《2022-2028年中国美容仪行业发展战略规划及投资机会预测报告》共十七章。首先介绍了中国美容仪行业市场发展环境、美容仪整体运行态势等,接着分析了中...

kt346的博客 468

工厂设备接MES为什么慢:协议识别与点表配置自动化的技术拆解

工业现场设备接 MES 的周期主要消耗在协议识别与点表配置。本文拆解这条链路的四层结构,给出点表映射的数据模型、两种部署架构的对比,以及可直接落地的三项验收口径与校验代码。适合工控集成、MES 实施、设备联网方向的工程师。

emfuture的博客 362

带挂牵引车前向运动模型推导及仿真实现

牵引车-半挂车的车辆结构与普通的车辆相比增加了一个半挂车,它们之间通过鞍座相连接,为了分析半挂牵引车运动过程中的位姿和状态,本文将基于车辆的机械结构建立对应的运动学模型,该模型基于以下假设: 车辆行驶过程中,道路平坦且无凸凹; 车辆低速行驶,且运行过程中车身无侧倾和俯仰运动; 车辆行驶过程中,轮胎无形变,无侧向滑动,且无侧向力; 牵引车和半挂车均满足阿克曼转向几何原理; 牵引车与半挂车不会发现折叠。

jianmo的博客 3181

list

的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。迭代到该位置,在这段位置上迭代需要线性的时间开销;最大的缺陷是不支持任意位置的随机访问,比如:要访问。还需要一些额外的空间,以保存每个节点的相关联信息。个元素,必须从已知的位置。

xie0510_的博客 261

解决PADs VX2.7安装中的License失效与软件卡死问题

本文详细解析了PADs VX2.7安装过程中常见的License失效与软件卡死问题,提供了从破解工具选择、环境变量设置到输入法兼容性调整等实用解决方案。特别推荐使用Siemens EDA系列新版破解工具,并分享性能调优与定期维护技巧,帮助工程师高效解决安装难题。

weixin_29234239的博客 813

Windows10检查Cuda和cuDNN是否安装成功?

简介:根据上篇博客已经完成了CUDA和cuDNN的安装步骤,完成对其的安装。下面将来检查它们是否安装成功。 1 .首先win+R进入CMD,在命令行输入nvcc -V,如下图所示,则表示cuda已经安装成功。 2 .进入到cuda的安装路径,C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.1\extras\demo_suite,找到如下两个.exe文件: 首先执行:deviceQuery.exe,查看是否出现如下界面: 然后执行bandwid

jhsignal的博客 14万+

向 excel、word、pdf 三种文档中占位符插入数据

【代码】向 excel、word、pdf 三种文档中占位符插入数据。

weixin_45934659的博客 40

3分钟创建智能体

智能体简介会在首页以及名片页展示,需要简洁明了的介绍智能体用途✅优秀示例:最好用第三人称直接说明智能体用途~如:打造生动文案好帮手、专业解梦,探寻梦境奥秘等❌反面教材:简介并未介绍用途、语义含糊。如:今天写点啥、看看你做的梦等以上步骤完成后,点击发布,就能成功创建属于你自己的智能体啦~仅自己可访问(免审):发布后仅开发者本人账号可访问、预览、使用该智能体仅链接可访问:发布后任何人均可通过链接访问、预览、使用该智能体。

soso1968的博客 2081

C++ STL 反向迭代器:从源码框架到适配器实现

在 C++ STL 中,反向迭代器(reverse_iterator)是一个很典型的设计案例:它本身并不直接持有容器数据,而是通过封装一个正向迭代器,把「前进」变成「后退」,从而让同一个容器既能正序遍历,也能逆序遍历。本文从 SGI-STL 3.0 的源码框架出发,梳理反向迭代器的设计思路,再手写一个通用的迭代器适配器,并在vector和list中完成适配与测试。在 SGI-STL 3.0 中,反向迭代器的核心源码位于。反向迭代器是一个适配器,各个容器再基于它适配出自己的反向迭代器类型。下面截取list。

Godbro的博客 226

企业网络架构设计:从内网到外网的无缝通信方案

本文详细解析了企业网络架构设计中的关键技术与实践方案,重点介绍了VLAN划分、OSPF路由优化、安全策略及无线网络集成等核心内容。通过OSPF多区域部署和链路聚合技术,实现内网到外网的无缝通信,提升企业网络性能与安全性。文章还提供了具体的配置示例和最佳实践,助力企业构建高效可靠的网络架构。

weixin_28331555的博客 623

Freeswitch 如何检测链路是否有回铃音

Freeswitch回铃音检测解决方案 问题描述:呼叫手机时,虽然信令正常(183/180),但部分手机无回铃音,导致坐席无法判断是否接通,用户体验差。 解决方案: 先播放本地音频作为回铃音 实时检测用户侧是否有声音输入 检测到声音后自动切换为用户侧音频 技术实现: 使用Freeswitch APP实现功能 创建结构体保存实例数据(包括铃声文件、会话句柄、VAD检测器等) 通过media bug机制实现音频流的替换 利用VAD(语音活动检测)技术监控用户侧声音 当检测到用户说话时自动终止本地铃声播放 该方案

2301_81507069的博客 51

[C++]:7.STL:list

好久不见,firdawn小课堂又和大家见面啦。今天我们要学习的内容是list容器,list也是一种常用的数据结构。下面是本章的思维导图,那么让我们开始学习吧!自定义的list,由三个结构构成。分别是链表的最小组成单位,也就是链表节点。以及迭代器类和list类其实要特别说明的是, List的迭代器,它不是单纯的指针,因为我们如果对指针直接进行解引用操作的话,我们得到的是这个节点,而不是节点里面存储的值并且我们对这个指针加加,得到的也不是下一个节点的地址,而是所在节点的下一个单位的地址。

2301_80817679的博客 169

AppStore逆向分析(登录、查询、下单)

某网站全协议流程逆向与分析(自动登录、激活、查询、下单)

吴秋霖的博客 3024

RT-Thread 5.4.0 完整版架构剖析(下):IPC、时钟、内存、设备与组件

从 IPC 全量、时钟与定时器、内存管理,到设备框架、组件层、软件包机制、移植裁剪与速查表,补齐 RT-Thread 5.4.0 完整版的下半张地图。

185

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

CMake 多目录工程实战:静态库与动态库的完整构建示例

本文通过一个完整CMake项目示例,展示了如何构建静态库(math)与动态库(sort),并分别在test1、test2中链接使用。项目结构清晰,顶层CMakeLists.txt统一管理变量,各子目录独立配置编译规则。通过add_library生成库,link_directories和link_libraries实现链接,最终完成构建与验证。重点区分了静态库(打包进可执行文件)与动态库(运行时加载)的差异,适用于实际工程化开发与面试准备。

2303_77004089的博客 111

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

第2讲:提示注入攻击——原理与防御

提示注入是攻击者通过恶意指令绕过AI系统规则的安全威胁,分为直接注入(如覆盖指令、角色扮演越狱)和间接注入(藏于文档或搜索结果中)。防御需三重机制:检测(识别高危模式与多轮诱导)、加固(设置优先级、随机分隔符、锁定输出)、净化(清除控制字符、编码、截断超长输入)。结合上下文分析与多模态处理,可有效防范编码绕过、过度净化等陷阱。核心理念:防御需检测、加固、净化联动,筑牢AI应用安全防线。

sandaoliuge的博客 253

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

CompletableFuture 实战:异步任务编排、异常处理、超时与线程池边界

本文以用户主页接口为例,详解 CompletableFuture 在异步任务编排中的实战应用。通过并行执行用户资料、订单与推荐数据查询,显著降低耗时。重点剖析了默认线程池风险、任务组合方式(如 allOf 与 thenApply)、异常处理机制、超时控制及上下文传递问题。强调应为阻塞 I/O 任务自定义线程池,避免占用 commonPool,并通过 completedFuture 灵活处理可选分支。最终实现高效、可控的异步编排,兼顾性能与稳定性。

此人很懒,什么都没有写~~ 352

TypeError: must be str, not list

【代码】TypeError: must be str, not list。

Forerunner and Successor 先駆者と後継者 36

Python 开发的实践:从数据结构选型到框架决策

规模多大?决定用list还是set,Pandas 还是 Polars。瓶颈在哪?I/O 密集用异步,CPU 密集用进程/自由线程,内存受限用列式与惰性执行。代价是什么?消除手动维护窗口的出错面,TaskGroup消除失败任务不被取消的泄漏,消除 N+1,Protocol消除为类型约束而引入的继承层级——每个选择都在消除某类代价,同时也引入新的约束。能回答这三个问题,比记住更多 API 更有用。愿你我都能在各自的领域里不断成长,勇敢追求梦想,同时也保持对世界的好奇与善意!

weixin_45809780的博客 366

Java Arrays.asList 常见坑详解|UnsupportedOperationException、数组联动、基本类型 bug

解析 Arrays.asList 常见开发陷阱,演示 UnsupportedOperationException、底层数组引用共享、基本类型数组问题,区分 Arrays 内部 ArrayList 与 java.util.ArrayList,给出数组转 List 的各种场景正确代码。

weixin_42617033的博客 422

2026 GEO工具实测:竞品分析的技术判断方法是什么?

GEO竞品分析需确保四要素对齐:问题集、平台、时间与口径。数据采集方式(API或爬虫)影响准确性,可通过抽测对比验证。关键在于验证原始数据一致性,偏差超20%即存疑。对比口径应透明,支持自定义问题池并分维度(平台、品类)分析,避免片面结论。唯有技术严谨,数据才可决策赋能。

2603_96364115的博客 75

CMake 实战指南:从基础语法到静态库/动态库制作与链接

本文系统介绍了CMake的基本用法,涵盖注释、变量定义、C++标准设置、可执行文件输出路径配置、文件查找及头文件引入。重点讲解了如何通过add_library创建静态库与动态库,并结合include_directories和target_link_libraries实现依赖管理。内容实用,适合作为CMake入门与项目构建参考。

2303_77004089的博客 203

HarmonyOS ArkUI 分页列表防重:游标推进、重复项合并与刷新隔离

长列表里“到底了”不总意味着下一页成功:列表底部事件可能在初次布局时就触发,网络重试可能重复返回上一页,用户下拉刷新时旧分页请求也可能最后才回来。若每次回调都直接 append,页面会出现重复卡片、顺序回跳,甚至刷新后的新结果又被旧结果覆盖。这类问题的关键不是多加一个isLoading,而是让分页请求有明确身份:它属于哪个查询代次、请求哪个游标、当前是否已有同游标请求在途。响应只有通过这些核对,才能按稳定 ID 合并并推进游标。本文用应用侧纯逻辑模型说明这个边界;

2401_84996024的博客 327

数据结构 数组与链表 内存与缓存

存储数组的内存空间是连续的存储链表的内存空间不是连续的链表在初始化后,仍可以在程序运行过程中对其长度进行调整,因此也称“动态数据结构”。数组在初始化后长度不可变,因此也称“静态数据结构”。值得注意的是,数组可通过重新分配内存实现长度变化,从而具备一定的“动态性”。,在算法中直接被使用。一个二进制位即为1 比特。现代计算机 CPU 通常将 1 字节作为最小寻址内存单元。。先将原码转换为反码,并在反码下计算 ,最后将结果从反码转换回原码,则可得到正确结果。

2503_94205631的博客 224

从零开始的C++生活——第七讲——02

关于迭代器,由于你要进行操作符重载,所以我选择封装一个迭代器类,从底层的角度思考,你拿到任意一个类型的迭代器一般都是要访问迭代器所指向的空间的成员,所以我们其实应该拿到迭代器所指向节点的值,因此这也是一个模板类,而且,我们要对迭代器的解引用操作符和->操作符进行重载,重载即是分别拿到对应的值以及对应值的地址,除此之外,在遍历过程中我们需要对迭代器进行比较,因此需要重载==!增加的模板参数一个传T的引用,一个传T的地址,而const类型的迭代器则是传const T&和const T*。

dshswra的博客 74

InnoDB 页结构详解:页类型、页头页尾、数据行与页目录

InnoDB以页为最小管理单元,页大小16KB,最大支持64TB表空间(2³²页×16KB)。页结构统一为三段式:页头(38B)、页体、页尾(8B),页头含校验和、LSN、页号及类型,页尾存副本用于防页断裂。数据页(INDEX页)布局包括页头、哨兵记录(Infimum/Supremum)、用户数据区、空闲区与页目录。记录由额外信息(变长字段列表、NULL位图、记录头)与真实数据组成,通过next_record形成单向链表。页目录实现二分查找,提升查询效率。页间通过双向链表(同层)与B+Tree父子关系连接,

bksczm的博客 726
上一篇: App.Previnstance Equivalent
下一篇: 写在冬日的第一天--一个女程序员第四年工作总结
clear_zero
博客等级 码龄24年 2426粉丝 36原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值