如何在CreateProcess实例化的命令中使用或扩展环境变量?

2023-12-10

下面的代码利用CreateProcess使用环境变量运行命令。在这里,它尝试运行notepad %APPDATA%\test.txt.

如果我跑notepad %APPDATA%\test.txt直接在Windows' CMD, %APPDATA% 将被扩展。但是,执行时无法扩展环境变量CreateProcess。您能帮忙评论一下原因和解决方法吗?任何评论将不胜感激!

directly within cmd use CreateProcess

    program TestConsole2;

    {$APPTYPE CONSOLE}

    uses
      Windows, SysUtils;

    var
      I: Integer;
      ProgramName: String;
      StartInfo  : TStartupInfo;
      ProcInfo   : TProcessInformation;
      CreateOK   : Boolean;
    begin
      try

        FillChar(StartInfo, SizeOf(StartInfo), #0);
        FillChar(ProcInfo, SizeOf(ProcInfo), #0);
        StartInfo.cb := SizeOf(StartInfo);

        ProgramName := 'NOTEPAD %APPDATA%\test.txt';
        CreateOK := CreateProcess(
          nil, PChar(ProgramName), nil, nil, True, 0, nil, nil, StartInfo, ProcInfo);
        if CreateOK then WaitForSingleObject(ProcInfo.hProcess, INFINITE);

        Readln(ProgramName);

      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    end.

Call 展开环境字符串扩展环境变量。

当您使用 cmd.exe 时,它​​会为您执行扩展。 CreateProcess 不会,因此您需要在调用 CreateProcess 之前执行此操作。或者,您可以使用 ShellExecute 来扩展环境字符串。

您当前的代码不符合 CreateProcess 的约定。第二个参数必须是指向可修改内存的指针。如果您使用 ANSI API,则可以避免这种情况,但当针对 Unicode 时,您的代码可能会失败。传递指向可修改内存的指针而不是指向文字的指针。如果您添加了扩展环境变量的调用,那么您最终会得到一个可修改的字符串。

最后,看起来您只是想打开一个文本文件。为什么强制用户在记事本中查看它?我的文本文件的默认编辑器不是记事本。我讨厌任何强迫我使用记事本的程序。相反,让 shell 在用户首选的编辑器中打开文件。调用 ShellExecute,使用“open”作为动词,并将文本文件名作为文件名参数传递。另一方面,也许您知道这一切,而这只是示例代码。如果是这样,请忽略此建议。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在CreateProcess实例化的命令中使用或扩展环境变量? 的相关文章

  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 使用项目中的波形文件

    我目前只能通过将波形文件放在已编译的 exe 旁边来播放背景声音 但我实际上想要一个包含波形文件的静态可执行文件 这在Delphi XE2中可能吗 这是我的代码 SndPlaySound Raw wav SND ASYNC or SND L
  • “此应用程序已请求运行时以异常方式终止它”的原因是什么?

    Visual C 运行时抛出一个常见错误 此应用程序已请求运行时以异常方式终止它 请联系应用程序的支持团队以获取更多信息 该错误消息实际上是什么意思mean 让我用一个比喻来准确地解释我的问题 如果我看到一条消息 异常 访问冲突 0xc00
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • 使用 BitBlt 捕获程序窗口始终返回相同的图像

    我编写了以下代码 C Win32 来捕获游戏窗口屏幕并从图像中获取像素颜色数组 函数 autoB 完成这项工作 然后我将结果数组绘制到窗口中以直观地检查我得到的结果 问题是 这个程序在我启动计算机后只工作一次 在第一次 缓存 从游戏中获取的
  • Delphi应用程序窗口z顺序和MainFormOnTaskBar属性

    我正在维护一个最初用 Delphi 7 编写并移植到 Delphi XE 的应用程序 使用 Windows 7 我们遇到了一些问题 例如模态窗口出现在主窗口下方 以及最终无法与程序交互 因为用户需要与模态窗体交互 而这是不可能的 因为它位于
  • opencv人脸检测示例

    当我在设备上运行应用程序时 应用程序崩溃并显示以下按摩 java lang UnsatisfiedLinkError 无法加载 detector based tracker findLibrary 返回 null 我正在使用 OpenCV
  • 如何在 Jenkins 声明式管道中设置 PATH

    在 Jenkins 脚本化管道中 您可以像这样设置 PATH 环境变量 node git url https github com jglick simple maven project with tests git withEnv PAT
  • 使用 Windows 批处理文件在文本文件中添加新行

    我有一个文本文件 其中有 200 多行 我只想在第 4 行之前添加一个新行 我使用的是 Windows XP 输入前的示例文本文件 header 1 header 2 header 3 details 1 details 2 输出后 hea
  • 开发者可以在 Windows 应用程序中使用 iCloud 吗?

    开发人员可以使用 Apple 的 iCloud API 在 Mac OS X 和 iOS 上的不同版本的应用程序之间同步应用程序数据 如果开发人员拥有 Windows 版本的应用程序 该版本是否也可以使用 iCloud 将应用程序数据与 M
  • 打印 TDBGrid [重复]

    这个问题在这里已经有答案了 如何在不安装或下载组件的情况下打印 DBGrid OR 如何将 DBGrid 的数据放入 RichEdit 以便我可以从那里打印它 数据感知控件从 DataSource 属性获取数据 并使用它 不过 您必须手动遍
  • 防止多个实例 - 但还要处理命令行参数?

    我正在从我的应用程序处理与 Windows 相关的扩展文件 因此 当您在 Windows 中双击文件时 它将执行我的程序 然后我从那里处理该文件 如下所示 procedure TMainForm FormCreate Sender TObj
  • 如何通过命令行将Flash .fla编译为.swf? [复制]

    这个问题在这里已经有答案了 如何在基于 Windows 的操作系统上通过命令行将 Flash fla 文件编译为 swf 需要安装的命令行工具就可以了 谁能建议我该怎么做 以直接的方式 谢谢 您可以使用JSFL为 Flash IDE 编写脚
  • 提取证书中主题属性的所有值

    我目前正在使用CertGetNameString http msdn microsoft com en us library windows desktop aa376086 28v vs 85 29 aspx提取每个主题属性的值 如下所示
  • 通过套接字发送动态数组(在记录内)?

    我正在尝试直接使用 SendBuf 将记录从服务器传输到客户端 但是 该记录有一个动态数组的成员 并且我在某处 在 SOF 中 读到 发送记录时 成员必须是静态的 固定长度 但问题是 我无法确定如何我会 将来 发送许多论点 我怎么解决这个问
  • 批处理脚本 FOR 循环仅设置输出的第一个字母 wsl --list -q

    我正在编写一个批处理脚本 将文件从 Windows 目录复制到 WSL 发行版 其中一部分是选择将文件复制到哪个发行版 如果我使用命令wsl list q如果给我以下输出 Ubuntu 22 04 Ubuntu 18 04 我正在尝试使用此
  • 从 Python 下载/安装 Windows 更新

    我正在编写一个脚本来自动安装 Windows 更新 我可以将其部署在多台计算机上 这样我就不必担心手动更新它们 我想用 Python 编写这个 但找不到任何关于如何完成此操作的信息 我需要知道如何搜索更新 下载更新并从 python 脚本安
  • Delphi中使用FindVCLWindow调用WinHelp32(WinXP Pro SP3 32bit)

    有什么问题吗 procedure TForm1 VCLHelpClick Sender TObject var Ctrl TWinControl begin Ctrl FindVCLWindow Mouse CursorPos if Ctr
  • Rails Windows Vagrant 响应时间非常慢

    我在跑 Vagrant 1 7 1 Rails 4 1 4 Thin 1 6 1 Windows 7 每个静态文件的发送时间都超过一秒 在我的 PC 上加载一个页面可能需要大约 20 秒 而在同事的 Linux 机器上则只需瞬间 有一些帖子
  • 在Windows 7上安装curl后缺少libcurl-4.dll

    按照这个人的安装curl后指示 https stackoverflow com a 28757477 1186038 除了第 2 步 已安装Win64 OpenSSL v1 0 1u 轻型相反 因为下载页面中缺少版本 k http slpr

随机推荐

  • 将字符串转换为 DateTime 对象

    我想将特定格式的字符串转换为DateTime 我的具体字符串格式是 dd mm yyyy 我无法进行任何字符串操作 这是我现在的代码 DateTime convertedDate DateTime Parse stringInput 看来你
  • 如何让固定位置的 div 随内容水平滚动?使用 jQuery

    我有一个带有以下 CSS 的 div scroll fixed scroll fixed position absolute top 210px scroll fixed fixed position fixed top 0 当 div 到
  • 如何循环遍历文件中的行块?

    我有一个如下所示的文本文件 其中的行块由空行分隔 ID 1 Name X FamilyN Y Age 20 ID 2 Name H FamilyN F Age 23 ID 3 Name S FamilyN Y Age 13 ID 4 Nam
  • 获取鼠标光标下的 RGB 值

    我正在尝试构建一个程序来检测鼠标光标下方的颜色 然后在屏幕上的窗口中显示颜色和 RGB 值 我对 Java 非常陌生 所以什么都不知道 在朋友的帮助下 我编写了两个代码 第一个获取缓冲图像的特定坐标的 RGB 值 另一个获取用户定义的 RG
  • jQuery animate 在小提琴中工作但在线不流畅

    我制作了一种带有三个扩展 div 的手风琴 a b c 在小提琴中 但是当我将其保存在本地并在浏览 器中打开它时 过渡不再平滑 点击后我特别注意到 b with a扩大了 我已包含引用 CSS 和 JavaScript 代码的 HTML 原
  • 了解 Powershell:示例 - 将 JSON 转换为 CSV

    我读过几篇文章 比如使用 PowerShell 将 JSON 转换为 CSV 关于使用 PowerShell 转换 CSV 我还了解到 在脚本中使用管道语法是一种相对较差的形式 它实际上是用于命令行的 并且随着时间的推移会给开发人员带来维护
  • 如何在MongoDB中设置缓冲区偏移范围,它不允许在BSON对象中上传超过16MB的文件?

    我的流程和代码 从表单数据上传图像并将图像的 BSON 字符串存储到数据库 以下是步骤和代码 从 multer upload 上传文件 从文件系统读取文件 fs 将图像内容字符串转换为base64字符串 将base64字符串转换为BSON字
  • 在 R 中使用线性回归填充 NA

    我有一个包含一个时间列和 2 个变量的数据 下面的示例 df lt structure list time c 15 16 17 18 19 20 21 22 23 24 25 26 var1 c 20 4 31 5 NA 53 7 64
  • LPARAM 和 WPARAM 的定义是什么?

    我知道我在这里很懒 我应该自己查找头文件 但是 LPARAM 和 WPARAM 参数的实际类型是什么 它们是指针还是四字节整数 我正在编写一些 C 互操作代码 并希望确保它可以在 x64 系统上运行 LPARAM是一个类型定义LONG PT
  • 使用 py2exe 打包 py 文件时出现“超出最大递归深度”

    几个月前 py2exe 在同一个 py 文件上运行得很好 但是当我今天再次尝试时 它失败了 报告了 运行时错误 超出了最大递归深度 结果我得到了一个空的 dist 文件夹 Py文件工作正常 只是无法打包 我猜py文件中导入的模块有问题 但我
  • WPF VS2013:查找资源字典时发生错误

    Team 我在 Visual Studio 2013 中有一个简单的 wpf 项目 结构如下所示 该错误所说的全部内容如标题 查找资源字典时发生错误 所示 我尝试了网上的很多建议 但已经失去耐心了 一切似乎都还好 任何对此有经验的人都可以提
  • v-for Loop 内的参考文献 vue v3.2.25 或更高版本

    我正在读vue 3 的文档我决定测试一下refs在我当地的开发环境中 我用的是vue版本3 2 31并根据设置我的项目vue官方指南 因此 为了测试组件中的 refs 我只需将代码复制并粘贴到this url那就是操场vue 网站 这意味着
  • 在 bash 中获取位置参数

    我有一个名为 foo 的 bash 脚本 其参数数量可变 第一个是必需的 即 foo a1 b2 b3 b4 我知道在 bash 中 1 会得到参数 a1 但是有没有办法得到所有其余的参数 或 似乎让我得到了所有参数 包括 a1 切片 ar
  • 通过嵌套连接选择最高的序列号

    我想为每个客户 ID 获取最大序列号 最大序列号将根据最高银行帐户余额计算 该表有100000条记录 Tables 客户端序列表 T1 ClID SeqId 1 11 1 12 1 13 1 14 1 15 2 16 2 17 2 18 2
  • C# 拖放问题

    我有一个 C NET 3 5 应用程序 允许从树中拖动项目并将它们作为文件拖放到文件夹中 这是我的代码 String absolutePathToFile get absolute path DataObject dataObject ne
  • 在我的 Ember.js 应用程序中的 localStorage.clear() 或 deleteRecord() 之后,本地存储数据被复活

    我观察到数据复活后localStorage clear or deleteRecord jsbin 示例 在我的 ember 应用程序中被调用 请按照以下步骤复制问题 打开 chrome web dev gt 资源 gt 本地存储 gt h
  • 根据单元格值脚本将行移动到另一个工作表

    希望使用脚本根据谷歌表格中的值移动单元格 在观看了一些有关基础知识的视频并使用网站上找到的代码之后 尝试使这适用于我的电子表格 这对所有这些都是超级绿色的 function doneCopy var app SpreadsheetApp v
  • Python 请求重定向登录

    这是一个网站http pro wialon com 我想使用 python requests 模块登录 登录和通过是演示 import requests with requests Session as c url http pro wia
  • 如何在 webview 中从我的资源加载图片?

    我想加载 WebView 中可绘制资源中设置的名为 map png 的图片 我在另一个答案中发现了这个建议 webview loadUrl file 但我不明白如何正确设置它 我总是收到错误消息 提示找不到所请求的文件 这是我写的 publ
  • 如何在CreateProcess实例化的命令中使用或扩展环境变量?

    下面的代码利用CreateProcess使用环境变量运行命令 在这里 它尝试运行notepad APPDATA test txt 如果我跑notepad APPDATA test txt直接在Windows CMD APPDATA 将被扩展