问题标签 [shellexecuteex]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1250 浏览

c++ - Missing data in Windows file properties dialog when opened by ShellExecuteEx

I want to show the Windows file properties dialog for a file from my C++ code (on Windows 7, using VS 2012). I found the following code in this answer (which also contains a full MCVE). I also tried calling CoInitializeEx() first, as mentioned in the documentation of ShellExecuteEx():

This code works, i.e. the properties dialog is shown and ShellExecuteEx() returns TRUE. However, in the Details tab, the size property is wrong and the date properties are missing:

Properties window opened via my program

The rest of the properties in the Details tab (e.g. the file attributes) are correct. Strangely, the size and date properties are shown correctly in the General tab (left-most tab).

If I open the properties window via the Windows Explorer (file → right-click → Properties), then all properties in the Details tab are shown correctly:

Properties window opened via Windows Explorer

I tried it with several files and file types (e.g. txt, rtf, pdf) on different drives and on three different PCs (1x German 64-bit Windows 7, 1x English 64-bit Windows 7, 1x English 32-bit Windows 7). I always get the same result, even if I run my program as administrator. On (64-bit) Windows 8.1 the code is working for me, though.

My original program in which I discovered the problem is an MFC application, but I see the same problem if I put the above code into a console application.

What do I have to do to show the correct values in the Details tab on Windows 7? Is it even possible?

0 投票
1 回答
3862 浏览

c++ - C++ ShellExecuteEx 不会通过不从该 exe 生成输出来执行带参数的 exe

最近几天或几周。在 Visual Studio C++ 中,我很难ShellExecuteEx()尝试在 exe 中运行带有参数的 exe。它发生的方式是我在 Visual Studio 中运行调试程序(甚至在外面)。该程序将启动另一个程序并成功运行,但它不会生成 .txt 文件输出。我不确定我是否正确使用了参数。这是我要实现的步骤:

  1. 启动 MainTest.exe (将打开 ScreenCapture.exe 的 exe)
  2. Cmd screen - MainTest.exe 已启动并准备使用 ShellExecuteEx 启动 ScreenCapture.exe
  3. 弹出UAC,以管理员身份运行
  4. 新的 cmd 屏幕 - ScreenCapture.exe 以参数和目录启动
  5. ScreenCapture.exe 完成命令并关闭
  6. 由 ScreenCapture.exe 生成的 CaptureText.txt 放置在与 ScreenCapture.exe 相同的目录中。

问题是我没有在我的目录中获得 CaptureText.txt 或任何证明参数在该程序中有效的证据。

现在,如果我在不使用带有参数的 Test.exe 的情况下运行 ScreenCapture.exe,它会工作并生成 .txt 文件。

这是代码:

示例:仅使用命令提示符,ScreenCapture.exe 与参数完美配合。我是这样输入的:

管理员:命令提示符

然后它会成功运行并写入一个名为 ScreenCapture.txt 的输出文件

但是,当我尝试使用我制作的 exe(此文件)运行它时。我无法生成输出。

0 投票
1 回答
271 浏览

windows - 使用 ShellExecuteEx 继承句柄

CreateProcess具有bInheritHandles允许新进程继承可继承句柄的参数。

是否ShellExecuteEx提供了这样的可能性?尤其是runas动词。

0 投票
0 回答
369 浏览

c++ - 从 ShellExecuteEx() 运行 pg_dump

当我尝试使用 ShellExecuteEx() 执行 pg_dump.exe 时,它​​返回退出代码 1(失败),我想我可能对我犯的一个简单错误视而不见。

这是在命令提示符下工作的命令行:

使用正确的内容创建备份文件。

以下是 SHELLEXECUTEINFO 结构的内容:

lpParameters 中的额外引号是因为微软在https://msdn.microsoft.com/en-us/library/windows/desktop/bb759784(v=vs.85).aspx说:“要在lpParameters,将每个标记括在一对引号中,如下例所示..."

ShellExecuteEx() 调用成功,但退出代码为 1,并且未创建 .backup 文件。

我尝试了各种形式的带引号和不带引号的调用,也尝试了 CreateProcess(),但结果是一样的——退出代码 1 并且没有备份文件。

我也尝试过使用 Cmd.exe 作为程序,使用“/K (etc)”作为参数,但这不起作用。

我错过了一些简单的事情吗?

谢谢。

9/8 编辑:我忘了提到 SetEnvironmentVariable() 用于在调用 ShellExecuteEx() 之前设置 PGPASSWORD。在测试过程中,我使用 GetEnvironmentVariable() 来确保该值存在。

编辑 2:我会尝试 Artemy 的建议。同时,我根据https://www.postgresql.org/docs/current/static/libpq-pgpass.html创建了一个密码文件,但没有任何区别。(为了清楚起见,我在 lpParameters 上添加了缺失的“L”。)

编辑 3:正如 Artemy 所建议的,我编写了一个程序来代替 pg_dump 调用。它只是将 pg_dump 通常接收到的命令行参数写入文件并退出。以下是结果(毫不奇怪;备份文件名不同,因为它是根据日期和时间动态创建的):

如果将结果传递给 pg_dump,那么结果 0 行(程序名称)可能是导致 pg_dump 失败的原因。我会追查到的。

编辑 4:我通过创建一个接受参数并调用 pg_dump 的批处理文件解决了这个问题。那行得通,但我仍然想知道另一种方法出了什么问题。

0 投票
1 回答
7086 浏览

c++ - 将多个 cmd.exe 参数/参数传递给 ShellExecute(Ex)?

我一直在尝试cmd.exe /c /v:on使用ShellExecuteand来执行ShellExecuteEx。但是,这两种方法似乎都只接受一个参数,因为当它遇到 时/v:onThe filename, directory name, or volume label syntax is incorrect.在 Windows 7 下会显示 a。

这是我尝试过的代码,目前正在搞乱(没有运气):

0 投票
2 回答
6632 浏览

delphi - Delphi 使用 ShellExecute 执行任务

几天来,我试图弄清楚如何使用 ShellExecute 在 Delphi 中执行具有指定任务的 ExeFile。下面是我的最新代码,给出了错误“找不到指定的文件”:

我敢肯定我在这里遗漏了一个小故障。任何帮助请...

非常感谢!


更新:删除了这部分。


解决方法:我去掉了IncludeTrailingPathDelimiter和ExtractFilePath,使用了ShellExecuteEx,并改正了Parameters。就是这样,能够解决问题。

0 投票
1 回答
770 浏览

delphi - 在 Delphi 中使用 ShellExecuteEx 在同一命令行中运行多个任务

我正在尝试使用 ShellExecuteEx 在同一命令行中运行多个任务。我在cmd.exe中运行没有问题,如下图:

现在,这是我在 Delphi 中运行一项任务的 ShellExecuteEx 版本,没有任何问题:

我想要实现的是使用 ShellExecuteEx 一个接一个地运行 2 个任务。它们之间没有先决条件/关系。它的功能相同,但将数据提供给我数据库中的不同表。

我的问题是:

  1. 是否可以在参数中的 1 个 ShellExecuteEx 命令中运行这 2 个任务?如果是这样,在参数内执行此操作的最佳方法是什么?
  2. 或者我应该创建一个 for 循环来一个接一个地运行这两个任务?
  3. 或者有什么建议?

我更喜欢第一个,因为它更干净并且在 ShellExecuteEx 的功能范围内。

我看过一些作品说我应该单独运行它们或创建一些脚本。


这是@Alex_89 共享的 ExecuteDOSOutput 的结果。因此,到目前为止,它在一个触发器中运行多个任务,并且能够在 MyApp TMemo 中捕获结果。除了结果与我的预期不同:

我期望获得实时的进步百分比,例如我在 CMD.exe 中运行它时得到的。

我的意图是从 CMD.exe 实时捕获进度%,并将其作为进度条或其他内容嵌入到 MyApp 中,这样我就可以触发完成并允许用户继续。

我只是希望是否有人可以帮助我从 CMD.exe 实时捕获进度%?

0 投票
1 回答
339 浏览

c++ - 如何复制带有 ERROR_NO_ASSOCIATION 错误的 ShellExecuteEx 失败?

我的应用程序通过将报告组合到一个文件中来向其最终用户显示报告,该.htm文件放置在用户的临时文件夹中(通过调用GetTempPathAPI 派生)。然后使用如下代码向用户显示:

我刚从一位客户那里得到一份错误报告,显示上面的代码报告了ERROR_NO_ASSOCIATION. 我得到的图片中的操作系统看起来像 Windows 8.1,或者可能是 Windows 7。

所以我一直试图通过删除所有文件关联.htm.html文件扩展名来在虚拟机中复制它,但ShellExecuteEx似乎从来没有失败过。在 Windows 10 上它总是打开 Edge,在 Win 8.1 上它显示这个弹出窗口:

在此处输入图像描述

有谁知道我可以如何复制该错误?

0 投票
0 回答
102 浏览

java - 通过 ShellExecuteEx 控制 jar 的运行

我们有一个 Java 项目。它有 5 个 CLI 命令指向 Project.jar

他们去像

  1. 示例服务器:这是一个在 CMD 中持续运行且不会关闭的服务器进程。

  2. 客户端代理示例:这是一个客户端进程,它在第二个 CMD 中继续运行并且不会关闭。在“示例服务器”完全启动之前,这无法启动。

3, 4, 5:这些是以下命令,例如“示例登录,...示例写入”等,可以在单个 cmd 中运行。在“示例服务器”和“示例客户端”完全启动之前,这些无法启动。

现在我正在尝试通过 C++ 可执行文件运行所有这些 jar

我不能使用 shell 执行,因为如果我为每个 java -jar 命令提供 shellexecute,它们都会同时运行(我不想要)。所以我使用 ShellExecuteEx 是这样的:

现在我知道硬编码时间不是一个好习惯。我可以做一些让 C 在 A 和 B 启动后执行的事情吗?

0 投票
0 回答
331 浏览

c++ - 如何使用 TerminateProcess() 关闭控制台窗口

我的 C++ 应用程序将 .cmd 文件作为子进程启动,如下所示:

该脚本test.cmd运行一个运行很长时间的控制台模式 .NET 应用程序,它看起来类似于:

ShellExecuteExA()我的 C++ 应用程序中返回时,execInfo.hProcess会保存其中的进程句柄以供以后使用。这个想法是使用该进程句柄来关闭子进程(脚本+ exe)。

但是当我试图关闭它时,似乎什么也没有发生。控制台窗口和长时间运行的 .NET 应用程序都愉快地继续运行。这是调用TerminateProcess()

应该TerminateProcess()期望在这种情况下工作吗?可能是因为这是一个无法正常工作的控制台窗口吗?