ServiceController.ExecuteCommand为何为调用失败?

问题:假设在地有一个自定义的Service,我们想通过另外一个程序来给它发送一个自定义的命令(比如说),怎么办?做法很简单:
 

可是,当调用时却抛出异常,
中文版:
[System.InvalidOperationException] = {"无法控制计算机“LL-PC”上的 MyService服务。"}
{System.ComponentModel.Win32Exception: 拒绝访问。}
英文版:
Cannot control <service name> service on computer '.'
Access denied.

Why?

刚刚开始以为是权限的问题,结果朝着这个方向调查了两小时,未果。最后终于知道为什么了,ServiceController.ExecuteCommand(int command)这个函数的参数调用错误。该参数的取值范围必须是128~255。悲剧了,万恶的MSDN居然没有解释。其实,MSDN也是给出了解释的,只不过并没有在.NET类库中做解释,我用.NET Reflector 7.0 反编译了一下 System.ServiceProcess.dll ,发现该函数最终调用的函数是 ControlService 这个API,而在这个API中,它做了一段解释。
This value can also be a user-defined control code, as described in the following table.
Control code: Range 128 to 255
Meaning: The service defines the action associated with the control code. The hService handle must have the SERVICE_USER_DEFINED_CONTROL access right.

 

因此,我们可以在定义Command的时候,可以这么做:
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!Java项目通常采用MVC架构,其中Controller层负责接收请求并调用Service层处理业务逻辑,最后将处理结果返回给前端。Service层则负责具体的业务逻辑处理,例如数据的增删改查等操作。下面是一个简单的Java项目Controller层和Service层的示例: Controller.java: ```java @RestController @RequestMapping("/api") public class UserController { @Autowired private UserService userService; @GetMapping("/users") public List<User> getAllUsers() { return userService.getAllUsers(); } @GetMapping("/users/{id}") public User getUserById(@PathVariable Long id) { return userService.getUserById(id); } @PostMapping("/users") public User createUser(@RequestBody User user) { return userService.createUser(user); } @PutMapping("/users/{id}") public User updateUser(@PathVariable Long id, @RequestBody User user) { return userService.updateUser(id, user); } @DeleteMapping("/users/{id}") public void deleteUser(@PathVariable Long id) { userService.deleteUser(id); } } ``` Service.java: ```java @Service public class UserService { @Autowired private UserRepository userRepository; public List<User> getAllUsers() { return userRepository.findAll(); } public User getUserById(Long id) { return userRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException("User", "id", id)); } public User createUser(User user) { return userRepository.save(user); } public User updateUser(Long id, User userDetails) { User user = userRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException("User", "id", id)); user.setName(userDetails.getName()); user.setEmail(userDetails.getEmail()); return userRepository.save(user); } public void deleteUser(Long id) { User user = userRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException("User", "id", id)); userRepository.delete(user); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值