问题标签 [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 回答
1102 浏览

vb6 - VB6 - 如何从作为服务运行的应用程序打开文件

我已经为这个问题苦苦挣扎了将近一个星期。我需要一个作为服务运行的 vb6 应用程序来打开文件。我不需要对文件做任何事情,我只需要打开它。我尝试使用 ShellExecute 和 ShellExecuteEx 以及使用 CreateProcess 尝试从命令行启动文件。当这些实现都不起作用时,我尝试启动另一个应用程序(使用 CreateProcess),其唯一任务是打开文件然后关闭自身。

这些解决方案在应用程序正常运行时都可以工作,但在作为服务运行时则不行。应用程序能够在作为服务运行时直接或间接打开文件非常重要,它只需要能够触发它即可。

我了解自 Windows Vista 以来 Windows 已锁定服务与桌面交互的能力,但我确信必须有一种方法可以从服务触发文件打开命令。我开发的应用程序能够使用 CreateProcess 从命令行运行 pg_dump.exe(postgres 数据库的备份可执行文件)来备份数据库文件,同时作为服务运行。这就是为什么我虽然从服务中启动一个 exe 来间接打开文件可能会起作用。但是,由于某种原因,该应用程序可以正常运行 pg_dump.exe,但不会运行我创建的可执行文件。我想知道我创建的 exe 是否期望在桌面上存在某种形式,这就是该服务不想启动它的原因。

这是我的 CreateProcess 代码(我没有写大部分,所以请原谅我的无知):

这是运行 pg_dump.exe 的实现,它在从服务运行 exe 并创建数据库备份文件时是成功的:

这是一个类似的实现,它尝试运行将尝试打开相关文件的辅助 exe:

当应用程序作为服务运行时,上述代码不起作用。为什么 pg_dump.exe 运行成功,而我自己的 GDNPOpener.exe 却没有?

如上所述,我也尝试使用 ShellExecute 和 ShellExecuteEx 直接从服务中打开文件,但没有成功。(我在辅助 exe (GDNPOpener.exe) 中使用 ShellExecuteEx 打开文件)

如果有人知道如何修复我的 exe 以便我的服务运行它,我将不胜感激!如果有人知道从服务打开文件的任何替代方法,那也将不胜感激,谢谢!

0 投票
2 回答
1979 浏览

c++ - 为什么 ShellExecuteEx() 参数不起作用?

假设我希望程序“C:\MyProgram.exe”使用两个变量的参数运行。出现的问题是 MyProgram 只接收 2 个参数,而我清楚地传递了 3 个参数。

我的代码:

因为互联网上没有太多关于 ShellExecuteEx 可变参数的信息,所以我找不到合适的解释。

你们中有人知道如何解决这个问题吗?提前致谢!

0 投票
1 回答
334 浏览

c++ - 拦截使用 ShellExecuteEx 打开的窗口的关闭消息

我有一个烦人的程序,在关闭时不会保存他的位置。我做了一个小控制台程序,打开它并将窗口移动到另一个位置,现在我想在程序关闭时保存位置,我如何拦截关闭消息,以便在窗口自行销毁之前保存位置?

0 投票
1 回答
1466 浏览

c++ - 如何确定使用 ShellExecuteEx 创建的进程是否拥有一个窗口?

ShellExecuteEx用来运行外部应用程序:

一切正常,但此外部应用程序存在计划外行为,在关闭其主窗口后,其进程仍处于活动状态。这可以防止WaitForSingleObject(shExInfo.hProcess, INFINITE);返回,我必须手动终止该过程。

相反,我正在寻找一种方法来替换WaitForSingleObject(shExInfo.hProcess, INFINITE);一个循环,该循环检查外部进程是否拥有一个窗口,如果没有则终止它。

这是我想到的,但如果有更好的方法,请为我​​指出。

更新:

感谢罗布森的回答,我设法做到了我打算做的事情:

我的循环:

0 投票
0 回答
150 浏览

c++ - 使用命令行命令时如何获取返回数据?

我继承了一个 c++ 应用程序,它使用“ShellExecuteEx”运行一些命令,特别是使用 appcmd.exe。我希望能够运行该命令,然后获取返回数据,就像我从命令行运行它时看到的那样。

我不一定想使用 ShellExecuteEx,但如果我不使用它,我需要运行一些非常简单的东西,因为我不习惯 C++ 编程。我的背景更多是 C# 和类似的语言。

0 投票
3 回答
406 浏览

delphi - 未提升的程序启动提升的更新程序,更新程序应等待程序完成

我有 2 个应用程序,program.exe 和 updater.exe,它们都是用 Delphi5 编写的。程序在没有管理员权限(也没有清单)的情况下运行,更新程序有一个带有“requireAdministrator”的清单,因为他必须能够在 Program-Folder 写入来更新 program.exe。

问题是启动更新程序并让他等到程序关闭。我在网上找到了不同的方法,但没有一种方法有效(在大多数情况下,第一个应用程序启动第二个应用程序并等待第二个应用程序的结束,在我的情况下,第二个应用程序应该等待第一个应用程序的结束)。

更新程序应该等待,这很容易
updater.exe

方式 1
使用 CreateProcess 启动更新程序:
program.exe

不做任何事情,仅当更新程序没有带有 requireAdministrator 的清单时才有效。如果我使用 explizit 管理员权限运行程序,它也可以工作。

方式 2 使用 ShellExecuteEx 启动更新程序:
program.exe

不起作用,MyHandle 每次运行此过程时都有不同的值(无需重新启动程序),因此更新程序无法使用它。

所以我不知道如何启动 updater.exe 并将 program.exe 的句柄写入文件中。

我对编程的这些部分不太熟悉......有人对我的问题有想法吗?

0 投票
0 回答
103 浏览

python-2.7 - Python:在提升模式下仅运行自动化脚本的一部分

我正在运行一些自动化测试,有些部分必须在提升模式下运行才能工作。这很好;我正在使用 pywin32 库中的 shell.ShellExecuteEx 来调用我自己的脚本,并且效果很好。

这些是我正在使用的确切参数:

到目前为止,我的方法是将整个自动化代码放入一个模块中,然后以提升的权限调用该模块。

但是,我的一些代码只有在没有以提升模式运行时才能工作。我必须在两者之间切换。我怎样才能做到这一点?

0 投票
1 回答
306 浏览

windows - 如何使用 ShellExecuteEx 实现“打开方式”命令并等待它完成?

看似简单的任务:我想打开标准 Windows 对话框以选择用于打开文件的应用程序,然后等待该应用程序完成。互联网告诉 ShellExecuteEx 是要走的路。

好的,代码如下:

但它不起作用:指定 SEE_MASK_INVOKEIDLIST 标志使 hProcess 始终为 NULL,即使确实启动了新进程。

如何解决这个问题?提前致谢!

0 投票
1 回答
2214 浏览

excel - ShellExecuteEx 在 Excel VBA 中崩溃

由于发生了 Windows 更新,一个 API 调用ShellExecuteEx(sExecuteInfo)崩溃,说:

0x75F7A529 (shell32.dll) 处的未处理异常访问冲突读取位置 0x68686903

我不知道这里出了什么问题,你能帮我吗?

定义 :

代码:

0 投票
1 回答
4438 浏览

c++ - ShellExecuteEx runas 中的 lpParameters

我正在 qt 中开发一个应用程序,我需要使用 ShellExecuteEx 来启动一个应用程序。我正在运行一个批处理文件,我需要向它传递 2 个参数。第一个参数只是一个字母,但第二个参数是可能包含也可能不包含空格的路径。无论我做什么,它都不会逃脱这些空间。似乎包含任何转义的引号实际上会破坏整个通话。我认为问题在于runas。我不是 100% 确定它是如何工作的,但它似乎正在复制调用并在升级的 shell 中运行它。似乎这个过程因添加的引号而中断。

这是我的 ShellExecute 代码。我已将其简化为传入 1 个参数,但这仍然会中断。

这是 test.bat 只是为了完整性

我得到的shell输出是。

脚本的路径是

您可以看到初始命令失败,因为它弄乱了原始路径。

知道如何使用这样的 runas 命令在参数中包含引号吗?