【VB6|第27期】如何在VB6中使用Shell函数实现同步执行

news2024/12/28 19:03:31

日期:2024年9月1日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006


在这里插入图片描述


文章目录

  • 一、前言
  • 二、Shell函数的同步执行问题
  • 三、实现同步执行的步骤
    • 1、`OpenProcess` :打开进程,以获得进程句柄。
    • 2、`WaitForSingleObject`:等待一个进程句柄指示的进程结束。
    • 3、`CloseHandle`: 关闭一个内核对象句柄。
  • 四、完整示例
  • 五、结论


一、前言


书接上回,Shell 函数是异步执行的,但还是有很多开发者在使用 Shell 函数打开外部程序时,会希望程序能够等待该外部程序执行完毕再继续执行,即同步执行。本文将为你介绍如何实现这一功能。

二、Shell函数的同步执行问题


然而,默认情况下,Shell 函数是异步执行的,这意味着它会启动一个新的进程,然后立即返回,不会等待该进程结束。这在某些场景下可能不是我们想要的结果。那么,如何实现同步执行呢?

三、实现同步执行的步骤


其实原理很简单,为了实现同步执行,就必须等待进程结束后才继续执行后面的代码。我们可以使用 Windows API 函数来达到我们的预期效果,步骤如下:

1、OpenProcess :打开进程,以获得进程句柄。

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long

其中,参数说明:

  • dwDesiredAccess:这是一个访问掩码,用于指定你想要对进程对象进行的操作类型。常见的访问权限包括:

    参数说明
    PROCESS_TERMINATE允许终止进程。
    PROCESS_CREATE_THREAD允许创建一个线程。
    PROCESS_VM_OPERATION允许在进程的地址空间进行操作。
    PROCESS_VM_READ允许读取进程的地址空间。
    PROCESS_VM_WRITE允许写入进程的地址空间。
    SYNCHRONIZE允许等待进程终止。

    通常为了等待进程结束,我们会使用 SYNCHRONIZE(即 Private Const SYNCHRONIZE = &H100000) 权限。

  • bInheritHandle:如果这个值为 TRUE,则创建的进程句柄可以被子进程继承;否则不能。

  • dwProcessId:要打开的进程的标识符,即 Shell 函数的返回值

返回值说明:

  • 如果函数成功,返回值是进程对象的句柄。
  • 如果函数失败,返回值是 NULL

2、WaitForSingleObject:等待一个进程句柄指示的进程结束。

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

其中,参数说明:

参数说明
hHandle要等待的内核对象的句柄(即 OpenProcess 函数的成功返回值)。这可以是事件、作业、进程、线程、互斥量或信号量的句柄。
dwMilliseconds等待的时间间隔,以毫秒为单位。如果这个值为 INFINITE(即 Private Const INFINITE = -1&),则该函数将无限期地等待,直到对象变为信号状态。

返回值说明:

返回值说明
WAIT_OBJECT_0对象处于信号状态。
WAIT_TIMEOUT指定的时间已经过去,但对象还没有处于信号状态。
WAIT_FAILED函数失败。

3、CloseHandle: 关闭一个内核对象句柄。

Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

其中 hObject 为要关闭的内核对象的句柄,即 OpenProcess 函数的成功返回值。

返回值说明:

  • 如果函数成功,返回值是非零。
  • 如果函数失败,返回值是零。

四、完整示例

以下是完整示例,展示如何使用 API 函数等待Shell 函数启动的进程结束:

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const SYNCHRONIZE = &H100000
Private Const INFINITE = -1&
Private Sub OpenBrowserAndWait()
    Dim RetVal As Long
    Dim ProcessHandle As Long
    Dim Result As Long
    ' 使用Shell函数启动浏览器
    RetVal = Shell("explorer http://www.example.com", 1)
    ' 如果Shell函数成功启动了进程,它会返回进程ID
    If RetVal > 0 Then
        ' 打开进程,以获得进程句柄
        ProcessHandle = OpenProcess(SYNCHRONIZE, 0, RetVal)
        ' 等待进程结束
        Result = WaitForSingleObject(ProcessHandle, INFINITE)
        ' 关闭进程句柄
        Call CloseHandle(ProcessHandle)
    End If
End Sub

在这个示例中,我们使用了以下API函数:

  • OpenProcess: 打开一个已存在的进程对象,并返回进程的句柄。
  • WaitForSingleObject: 等待一个事件,在这种情况下,等待一个进程句柄指示的进程结束。
  • CloseHandle: 关闭一个内核对象句柄。

通过这些 API 函数,我们实现了 Shell 函数的同步执行功能。现在,VB 程序会暂停执行,直到启动的进程结束。

五、结论


通过本文,我们学会了如何在 VB6 中使用 Shell 函数实现同步执行。这种方法可以帮助我们更好地控制程序流程,确保外部程序执行完毕后再继续执行后续操作。希望本文对大家有所帮助!如有疑问,欢迎在评论区留言讨论。


参考文章:

  • 《Visual Basic for Applications Shell 函数》
  • 《Windows 应用开发 OpenProcess 函数》
  • 《Windows 应用开发 WaitForSingleObject 函数》
  • 《Windows 应用开发 CloseHandle 函数》

版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/141928541

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2111986.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法打卡——田忌赛马问题

问题简介&#xff1a;就是一个贪心的思想&#xff0c;下面上题目 要求示例输出输入 大体上先比较快马&#xff0c;田的快马与王的快马 其次比较田的慢马与王的慢马&#xff0c; 两处边界比较完全之后可以直接贪心了 几份示例的代码 代码一 #include <bits/stdc.h> …

【数据结构-二维前缀和】力扣1504. 统计全 1 子矩形

给你一个 m x n 的二进制矩阵 mat &#xff0c;请你返回有多少个 子矩形 的元素全部都是 1 。 示例 1&#xff1a; 输入&#xff1a;mat [[1,0,1],[1,1,0],[1,1,0]] 输出&#xff1a;13 解释&#xff1a; 有 6 个 1x1 的矩形。 有 2 个 1x2 的矩形。 有 3 个 2x1 的矩形。 有…

ia复习笔记

HCIA 常用配置以及快捷键&#xff1a;! 查看时间&#xff1a;display clock&#xff1b;修改时间&#xff1a;clock datetime 11:11:11 2023-1-1 查看设备当前的配置&#xff1a;display current-configuration&#xff1b;查看已保存的配置&#xff1a;display saved-config…

水晶连连看 - 无限版软件操作说明书

水晶连连看 – 无限版游戏软件使用说明书 文章目录 水晶连连看 – 无限版游戏软件使用说明书1 引言1.1 编写目的1.2 项目名称1.3 项目背景1.4 项目开发环境 2 概述2.1 目标2.2 功能2.3 性能 3 运行环境3.1 硬件3.2 软件 4 使用说明4.1 游戏开始界面4.2 游戏设定4.2.1 游戏帮助4…

docker拉取redis5.0.5并建立redis集群

1.配置文件 mkdir -p redis-cluster/7001/ mkdir -p redis-cluster/7002/ mkdir -p redis-cluster/7003/ mkdir -p redis-cluster/7004/ mkdir -p redis-cluster/7005/ mkdir -p redis-cluster/7006/cd redis-clustervim 7001/redis.confbind 0.0.0.0port 7001cluster-enabled…

传统CV算法——图像特征算法概述

文章目录 传统CV——图像特征算法概述1. 概述1.1 图像特征概述1. 2 局部特征1.2.1 定义1.2.2 特点1.2.3 常见方法1.2.4 应用 1.3 全局特征1.3.1 定义1.3.2 特点1.3.3 常见方法1.3.4 应用 1.4 局部特征与全局特征的比较1.5 局部特征点1.5.1 斑点与角点 1. 定义2. 特征3. 应用4. …

批量处理PDF神器:快速转换、压缩,提升工作效率

现在PDF格式的文件流通率越来越高了&#xff0c;因为它可以完整的保存文档原有的格式而被大家所使用。但是这个格式的文档编辑对很多人来说还比较陌生。这次我介绍几款pdf软件让你实现轻松编辑。 1.福昕PDF编辑器 链接一下>>https://editor.foxitsoftware.cn 这家公司…

Dance with Compiler - EP2

今天来熟悉汇编指令。 基本指令特点 str: store value to memory ldr: load value from memory stp: store register value to stack ldp: load stack value to register 更新寄存器的操作&#xff0c;一般结果寄存器是左操作数。 写内存的操作&#xff08;str&#xff09;&…

不同工况下的迁移轴承故障诊断,融合SE注意力机制的Resnet18迁移学习,附MATLAB代码...

概要 迁移学习&#xff08;Transfer Learning&#xff09;是一种在机器学习中广泛应用的技术&#xff0c;它利用在一个任务上获得的知识来帮助解决另一个相关任务。迁移学习尤其适用于数据量有限或训练成本较高的情况。它可以显著提高模型的性能和训练效率。 本期采用MATLAB语…

新材料 金属3D打印发展的加速器

在金属3D打印的广阔舞台上&#xff0c;材料性能犹如舞台的台柱&#xff0c;直接决定了打印工件性能的优劣。从强度、硬度到耐腐蚀性、抛光性及导热性&#xff0c;每一项指标都紧密关联着材料的选择&#xff0c;而优质材料正是推动这项技术跨越边界、深入更多行业领域的核心动力…

一个vue重新回顾,好多年前写的

在校期间简单跟着视频学习的代码&#xff0c;后面上传到github仓库就一直没有使用了&#xff0c;今天重新加载&#xff0c;重新启动。下面是启动时候遇到的问题&#xff0c;主要原因是我这部电脑是新电脑&#xff0c;很多环境还没有搭建。 成功启动后的页面效果 这里采用的思…

oauth2 方式获取outlook邮箱收件箱(python)

1.在Azure 门户注册应用程序 微软文档地址 重定向的地址配置(微软地址)&#xff1a; https://login.microsoftonline.com/common/oauth2/nativeclient 注册应用地址 2.程序代码 #安装包以及需要的驱动 pip3 install playwrightplaywright install import base64 import jso…

服务器模型 Reactor 和 Proactor

Proactor 具体流程如下&#xff1a; 处理器发起异步操作&#xff0c;并关注 IO 完成事件&#xff1b;事件分离器等待操作完成事件&#xff1b;分离器等待过程中&#xff0c;内核并行执行实际的 IO 操作&#xff0c;并将结果存储入用户自定义的缓冲区&#xff0c;最后通知事件分…

零工市场小程序:自由职业者的日常工具

零工市场小程序多功能且便捷&#xff0c;提供了前所未有的灵活性和工作效率。这类小程序不仅改变了自由职业者的工作方式&#xff0c;也重塑了劳动力市场的格局。 一、零工市场小程序的特点 即时匹配&#xff1a;利用先进的数据算法&#xff0c;零工市场小程序能够快速匹配自由…

ASP.Net Core 因集成WebSocket导致Swagger UI显示错误

文章目录 前言一、ApiExplorerSettings二、解决Swagger UI显示问题 前言 Swagger UI 本身并不支持直接展示或测试 WebSocket 端点。Swagger&#xff08;现在称为 OpenAPI&#xff09;及其 UI 实现主要是为 RESTful API 设计的&#xff0c;这些 API 基于 HTTP 请求/响应模型。W…

IDEA加载工程报错Error Loading Project: Cannot load module demo.iml解决

spring boot工程由于工程名字为demo不太好&#xff0c;直接更改了这个工程的名字&#xff0c;主要操作了包括重命名项目文件夹、修改IDEA中的项目名称、模块名称、包名称、以及相关的配置文件等。 然后再打开工程&#xff0c;报错Error Loading Project: Cannot load module de…

MyBatis ——在java层面对MySQL数据库进行操作

目录 MyBatis 是一款优秀的 持久层框架&#xff0c;用于简化JDBC&#xff08;java操作数据库&#xff09;的开发&#xff1b; 使用MyBatis 查询所有用户数据的过程 Lombok是一个实用的]ava类库&#xff0c;能通过注解的形式 简化 JavaBean的代码 注解&#xff1a; 引入Myb…

Oracle之用TO_CHAR函数将日期格式转化为不带前导零的月份和日

要求&#xff1a; 1、日期格式转化成字符串格式&#xff0c;月和日前面的0需要去掉&#xff0c;如日期2024-09-06需要转化成2024-9-6&#xff1b; 2、如果用截取拼接函数写法就会复杂&#xff0c;最好用TO_CHAR函数格式化实现。 正确写法&#xff1a; SELECT TO_CHAR(SYSDAT…

使用cage工具包生成验证码

目录 1. 导入依赖2. 控制类3. 测试 1. 导入依赖 <!-- 验证码工具 --><dependency><groupId>com.github.cage</groupId><artifactId>cage</artifactId><version>1.0</version></dependency>2. 控制类 RestControl…

SD-WAN解决外贸企业网络搭建问题

在全球化浪潮下&#xff0c;外贸企业日益感受到互联网和数字化技术对业务发展的重要性。作为一种创新的网络解决方案&#xff0c;SD-WAN&#xff08;软件定义广域网&#xff09;正成为外贸企业网络升级的重要助力。本文将深入剖析SD-WAN如何有效解决外贸企业网络搭建中的关键问…